使用java BatchInserter创建neo4j数据库后,无法使用py2neo访问neo4j数据库

时间:2013-05-27 09:51:37

标签: java neo4j cypher py2neo

解决

好的,我刚刚搞砸了neo4j-server.properties`配置文件,我不应该用“...”编写数据库路径。

我使用java的插件创建了一个neo4j数据库,我努力用py2neo访问它。这是我的java代码:

///opt/java/64/jdk1.6.0_45/bin/javac -classpath $HOME/opt/usr/neo4j-community-1.8.2/lib/*:. neo_batch.java
///opt/java/64/jdk1.6.0_45/bin/java -classpath $HOME/opt/usr/neo4j-community-1.8.2/lib/*:. neo_batch


import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.graphdb.index.Index;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import java.lang.Long;

import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.DynamicRelationshipType;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.RelationshipType;
import org.neo4j.helpers.collection.MapUtil;
import org.neo4j.unsafe.batchinsert.BatchInserter;
import org.neo4j.unsafe.batchinsert.BatchInserterImpl;
import org.neo4j.unsafe.batchinsert.BatchInserters;
import org.neo4j.unsafe.batchinsert.BatchInserterIndex;
import org.neo4j.unsafe.batchinsert.BatchInserterIndexProvider;
import org.neo4j.unsafe.batchinsert.LuceneBatchInserterIndexProvider;


public class neo_batch{
    private static final String KEY = "id";

    public static void main(String[] args) {


        //create & connect 2 neo db folder
        String batch_dir = "neo4j-batchinserter-store";
        BatchInserter inserter = BatchInserters.inserter( batch_dir );

        //set up neo index
        BatchInserterIndexProvider indexProvider =
            new LuceneBatchInserterIndexProvider( inserter );
        BatchInserterIndex OneIndex  =
            indexProvider.nodeIndex( "one", MapUtil.stringMap( "type", "exact" ) );
        OneIndex.setCacheCapacity( "id", 100000 );

        //batchin graph, index and relationships
        RelationshipType linked = DynamicRelationshipType.withName( "linked" );
        for (int i=0;i<10;i++){
            System.out.println(i);
            long Node1 = createIndexedNode(inserter, OneIndex, i);
            long Node2 = createIndexedNode(inserter, OneIndex, i+10);
            inserter.createRelationship(Node1, Node2, linked, null);
        }
        indexProvider.shutdown();
        inserter.shutdown();

    }

    // START SNIPPET: helperMethods

    private static long createIndexedNode(BatchInserter inserter,BatchInserterIndex OneIndex,final long id)
    {
        Map<String, Object> properties = new HashMap<String, Object>();
        properties.put( KEY, id );
        long node = inserter.createNode( properties );
        OneIndex.add( node, properties);
        return node;
    }

    // END SNIPPET: helperMethods


}

然后我相应地修改neo4j-server.properties配置文件并启动neo4j start

以下python代码表明图表为空

from py2neo import neo4j

graph = neo4j.GraphDatabaseService("http://localhost:7474/db/data/")

graph.size()
Out[8]: 0

graph.get_indexed_node("one",'id',1)

我的appraoch有什么问题?感谢

修改

我也不能用cypher计算节点:

neo4j-sh (?)$ START n=node(*)                 
> return count(*);
+----------+
| count(*) |
+----------+
| 0        |
+----------+
1 row
0 ms

编辑2

我可以用java api检查索引和节点是否存在

private static void query_batched_db(){
    GraphDatabaseService graphDb = new GraphDatabaseFactory().newEmbeddedDatabase( batch_dir);

    IndexManager indexes = graphDb.index();
    boolean oneExists = indexes.existsForNodes("one");
    System.out.println("Does the 'one' index exists: "+oneExists);
    System.out.println("list indexes: "+graphDb.index().nodeIndexNames());

    //search index 'one'
    Index<Node> oneIndex = graphDb.index().forNodes( "one" );

    for (int i=0;i<25;i++){
        IndexHits<Node> hits = oneIndex.get( KEY, i );
        System.out.println(hits.size());
    }

    graphDb.shutdown();

}

输出

Does the 'one' index exists: true
list indexes: [Ljava.lang.String;@26ae533a
1
1
...
1
1
0
0
0
0
0

现在如果我使用python填充图形,我将无法使用之前的java方法访问它们(将再次计算20)

from py2neo import neo4j

graph = neo4j.GraphDatabaseService("http://localhost:7474/db/data/")
idx=graph.get_or_create_index(neo4j.Node,"idx")
for k in range(100):
    graph.get_or_create_indexed_node('idx','id',k,{'id':k}

编辑3

现在我删除我使用batchinserter创建的商店,即neo4j-test-store,而neo4j-server.properties配置文件继续指向已删除的商店,即org.neo4j.server.database.location="{some_path}/neo4j-test-store"

现在如果我运行一个密码计数,我得到100,100是我使用py2neo插入的节点数。

我对这些东西感到很疯狂!

解决

好的,我刚刚搞砸了neo4j-server.properties`配置文件,我不应该用“...”编写数据库路径。

0 个答案:

没有答案