将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
答案 0 :(得分:3)
您忘记使用该标签:查询中您自己的节点的用户。确保在创建节点时也使用了该标签。
而且您不需要旧的自动索引。