salvador
salvador

Reputation: 1089

Cannot retrieve indexed nodes in Neo4j

I load my data using the following code:

public void createGraph() {
 Map<String, String> config = new HashMap<String, String>();
 config.put("cache_type", "none");
 config.put("use_memory_mapped_buffers", "true");
 config.put("neostore.nodestore.db.mapped_memory", "200M");
 config.put("neostore.relationshipstore.db.mapped_memory", "1000M");
 config.put("neostore.propertystore.db.mapped_memory", "250M");
 config.put("neostore.propertystore.db.strings.mapped_memory", "250M");
 inserter = BatchInserters.inserter("./data/neo4j", config);

 long start = System.currentTimeMillis();

 try {
 BufferedReader reader = new BufferedReader(new InputStreamReader(new 
 FileInputStream("./data/enronEdges.txt")));
 String line;
 int lineCounter = 1;
 long srcNode, dstNode;
 while((line = reader.readLine()) != null) {
 if(lineCounter > 4) {
 String[] parts = line.split("\t");

 srcNode = getOrCreate(parts[0]);
 dstNode = getOrCreate(parts[1]);

 inserter.createRelationship(srcNode, dstNode, RelTypes.SIMILAR, null);
 }
 lineCounter++;
 }
 reader.close();
 } 
 catch (IOException e) {
 e.printStackTrace();
 }

 long time = System.currentTimeMillis() - start;
 inserter.createDeferredSchemaIndex(NODE_LABEL).on("nodeId").create();
 System.out.println("Loading time: " + time / 1000.0);

 inserter.shutdown();
 }

 private long getOrCreate(String value) {

 Long id = cache.get(Long.valueOf(value));
 if(id == null) {
 Map<String, Object> properties = MapUtil.map("nodeId", value);
 id = inserter.createNode(properties, NODE_LABEL);
 cache.put(Long.valueOf(value), id);
 }
 return id;
 }

Then I am trying to retrieve the nodes with this code:

GraphDatabaseService gdb = new GraphDatabaseFactory().newEmbeddedDatabase(dbPath);
try(Transaction tx = gdb.beginTx()) {
 Node n  = gdb.findNodesByLabelAndProperty(DynamicLabel.label("Node"), "nodeId", 1).iterator().next();
 System.out.println(n);

}

But I am getting the following error:

Exception in thread "main" java.util.NoSuchElementException: No more elements in org.neo4j.collection.primitive.PrimitiveLongCollections$5@6b3ab760 at org.neo4j.collection.primitive.PrimitiveLongCollections$PrimitiveLongBaseIterator.next(PrimitiveLongCollections.java:60) at org.neo4j.collection.primitive.PrimitiveLongCollections$13.next(PrimitiveLongCollections.java:712) at org.neo4j.helpers.collection.ResourceClosingIterator.next(ResourceClosingIterator.java:76) at test.Neo4jBatchInsert.visitAllNodes(Neo4jBatchInsert.java:56) at test.Neo4jBatchInsert.main(Neo4jBatchInsert.java:49)

Isn't this the proper way to get an indexed node?
FYI, I use neo4j 2.1.3 embedded.

Upvotes: 0

Views: 87

Answers (1)

Stefan Armbruster
Stefan Armbruster

Reputation: 39915

The index is populated when gdb has been initialized so it might take some time for bringing the index online.

You might call gdb.schema().awaitIndexesOnline(10l, TimeUnits.MINUTES) prior to findNodesByLabelAndProperty to make sure indexes are in place.

Upvotes: 1

Related Questions