0
votes

I'm very new to neo4j. I've read this question (Cypher Query not finding Node) but it does not work. I'm getting the error, the the auto_node_index was not found. Perhaps it is because I'm using the BatchInserter?

For my experiment, I'm using neo4j 1.8.2 and the programming language Java with the embedded database.

I want to put some data to the database using the BatchInserter and the BatchInserterIndex like explained on http://docs.neo4j.org/chunked/milestone/batchinsert.html.

    BatchInserter myInserter = BatchInserters.inserter(DB_PATH);
    BatchInserterIndexProvider indexProvider =
            new LuceneBatchInserterIndexProvider( myInserter );
    BatchInserterIndex persons =
            indexProvider.nodeIndex( "persons", MapUtil.stringMap( "type", "exact" ) );
    persons.setCacheCapacity( "name", 10000 );

First I read the data from a TGF-file, create the nodes and put it to the inserter like this:

    properties = MapUtil.map("name", actualNodeName, "birthday", birthdayValue);
    long node = myInserter.createNode(properties);
nodes.add(node);
persons.flush();

The insert works fine, but when I want to search a node with Cypher, the result is empty

    ExecutionEngine engine = new ExecutionEngine( db );
    String query =
        "start n=node:persons(name='nameToSearch')  "
        + " match n-[:KNOWS]->m " 
        + " return n.id, m ";
    ExecutionResult result = engine.execute( query );
    System.out.println(result);

On the other side, when I'm using the Traverser-class and start the search on the rootnode, I receive the nodes wich are connetced by the node with the name "nameToSearch".

Can anybody explain me, why I can't get the nodes with Cypher!

here is the complete method for the batch insert:

 public long batchImport() throws IOException{

    String actualLine;
    ArrayList<Long> nodes = new ArrayList<Long>();
    Map<String,Object> properties = new HashMap<String,Object>();

    //delete all nodes and edges in the database
    FileUtils.deleteRecursively(new File(DB_PATH ));

    BatchInserter myInserter = BatchInserters.inserter(DB_PATH);
    BatchInserterIndexProvider indexProvider =
            new LuceneBatchInserterIndexProvider( myInserter );
    BatchInserterIndex persons =
            indexProvider.nodeIndex( "persons", MapUtil.stringMap( "type", "exact" ) );
    persons.setCacheCapacity( "name", 10000 );

    long execTime = 0;
    try{
        //Get the file which contains the graph informations
        FileReader inputFile = new FileReader(UtilFunctions.searchFile(new File(PATH_OUTPUT_MERGED_FILES), "nodesAndEdges").get(0));
        LineNumberReader inputLine = new LineNumberReader(inputFile);

        // Read nodes up to symbol #
        execTime = System.nanoTime();
        while ((actualLine=inputLine.readLine()).charAt(0) != '#'){

        StringTokenizer myTokenizer = new StringTokenizer(actualLine);
        // Read node number 
        String actualNodeNumber = myTokenizer.nextToken();
        // Read node name
        String actualNodeName = myTokenizer.nextToken() + " " + myTokenizer.nextToken();
        //Read property             
        myTokenizer.nextToken();
        String actualNodePropertyKey = BIRTHDAY_KEY;
        String actualNodePropertyValue = myTokenizer.nextToken();
        actualNodePropertyValue = actualNodePropertyValue.substring(1, actualNodePropertyValue.length()-1);

      // Insert node information                        
        properties = MapUtil.map("name", actualNodeName, "birthday", actualNodePropertyValue, "id", actualNodeNumber);
        long node = myInserter.createNode(properties);
        nodes.add(node);
        persons.flush();
    }

    // Read edges up to end of file
    int countEdges = 0;
    while ((actualLine=inputLine.readLine()) != null){
        StringTokenizer myTokenizer = new StringTokenizer(actualLine);
        // Read start node number 
        String actualStartNodeNumber = myTokenizer.nextToken();
        // Read destination node number 
        String actualDestinationNodeNumber = myTokenizer.nextToken();
        // Read relationship type
        String actualRelType = myTokenizer.nextToken();

        // Insert node information into ArrayList
        int positionStartNode = Integer.parseInt(actualStartNodeNumber);
        int positionDestinationNode = Integer.parseInt(actualDestinationNodeNumber);

        properties.clear();

        if (countEdges == 0) {
            myInserter.createRelationship(0, nodes.get(positionStartNode-1), RelType.ROOT, properties);
            myInserter.createRelationship(nodes.get(positionStartNode-1), nodes.get(positionDestinationNode-1), RelType.KNOWS, properties);
        }
        else
        {
            myInserter.(nodes.get(positionStartNode-1), nodes.get(positionDestinationNode-1), RelType.KNOWS, properties);
        }
        countEdges++;
    }                 
    indexProvider.shutdown();
    myInserter.shutdown();
    execTime = System.nanoTime() - execTime;
    // Close input file
    inputLine.close();
    inputFile.close();

    }
    catch (Throwable e){
        System.out.println(e.getMessage());
        e.printStackTrace();
    }
    return execTime; 
 }      
2
In your second code example, you have nodes.add(node), where is nodes defined?Nicholas
sorry, it was not the complete code snippet. nodes is defined a line before myInserter in this way: ArrayList<Long> nodes = new ArrayList<Long>();Rahel N.
you should start first with "start n=node(*) return n" to see if there's anything on the database ! That way you'll know if it's an import or a query problem...bendaizer
the query start n=node(*) return n works. Also using the Traverser-class works fine. Only the indexing doesn't work. :(Rahel N.

2 Answers

0
votes

It is crucial that the code using Batchinserter API calls shutdown() on both the BatchInserterIndexProvider and BatchInserter. Maybe you've missed this in your code.

If this does not solve the problem, please post your code.

0
votes

Your lacks a call to profiles.add(node, <indexProperties>). Therefore you're never adding anything to the index.