为什么Neo4j对嵌入式Cypher的朋友朋友查询很慢

时间:2014-04-21 01:01:36

标签: java neo4j

将neo4j 2.0.2与Oracle JDK 7和Mac OS X 10.8一起使用

我正在测试Neo4j作为嵌入式数据库,看看它对朋友的简单朋友查询的速度有多快。

这就是create DB:

的方法
GraphDatabaseService graphDb = new GraphDatabaseFactory()
                .newEmbeddedDatabaseBuilder("./data")
                .setConfig(GraphDatabaseSettings.node_auto_indexing, "true")
                .setConfig(GraphDatabaseSettings.relationship_keys_indexable, "true")
                .newGraphDatabase();

这就是我在用户节点'username'上创建索引的方法:

try (Transaction tx = graphDb.beginTx()) {
    Schema schema = graphDb.schema();
    schema.indexFor(DynamicLabel.label("User")).on("username").create();      
    tx.success();
}

然后我为自己创建一个节点并创建1000个节点作为用户,随机我只做1作为我的朋友。他们每个人都有50个节点作为朋友。所以我总共有50个朋友的朋友。 (通过KNOW关系)

这就是我查询的方式:(在解决方案之后编辑:你可以在cypher查询中看到我:用户来解决问题。)

StringBuilder sb = new StringBuilder();
long start = System.currentTimeMillis();
ExecutionResult result = engine.execute("MATCH (me:User { username: 'erdogany' })-[:KNOWS*2..2]-(friend_of_friend) " +
        "WHERE NOT (me)-[:KNOWS]-(friend_of_friend) " +
        "RETURN ID(friend_of_friend)");


for (Map.Entry<String, Object> column : result.javaIterator().next().entrySet()) {
    sb.append(column.getKey()).append(": ").append(column.getValue()).append("\n");
}

long total = System.currentTimeMillis() - start;

System.out.println(total);
System.out.println(sb.toString());

无论我运行查询多少次,都需要大约1400毫秒

结果:(我在一个循环中运行查询,因此它变暖,但似乎不是)

1399
ID(friend_of_friend): 2552

1397
ID(friend_of_friend): 2552

1405
ID(friend_of_friend): 2552
...

这很慢。我在这里缺少什么?

PS:你可以在这里找到完整的代码: https://github.com/erdogany/neo4j-embedded-simple/blob/master/src/main/java/org/yusuf/Application.java

1 个答案:

答案 0 :(得分:3)

您忘记使用该标签:查询中您自己的节点的用户。确保在创建节点时也使用了该标签。

而且您不需要旧的自动索引。

相关问题