2013-03-15 112 views
5

我试过一些小的修改后给出here的例子 - 主要是我添加了一个没有匹配的where子句 - 用于实验目的。Neo4j密码查询性能低下

在我的系统(1.9.M04 - 的Java 6u43 - Ubuntu的12.04 - AMD羿龙II 1090T -X6)的简单查询

随着数据库只是1个节点(也嵌入)了262毫秒。显然有什么问题。可能是什么问题呢 ?

感谢

public void test() 
    { 
     GraphDatabaseService db = g = new GraphDatabaseFactory().newEmbeddedDatabase("./neo4j1test"); 

     long id; 
     Transaction tx = db.beginTx(); 
     try 
     { 
      Node refNode = db.createNode(); 
      id = refNode.getId(); 
      refNode.setProperty("name", "reference node"); 
      tx.success(); 
     } 
     finally 
     { 
      tx.finish(); 
     } 


     ExecutionEngine engine = new ExecutionEngine(db); 
     ExecutionResult result = engine.execute("start n=node("+id+") where (n.name = \"reference node\") return n.name"); 
     long time = System.currentTimeMillis(); 
     result = engine.execute("start n=node("+id+") where (n.name = \"reference node\") return n.name"); 
     time = (System.currentTimeMillis() - time); 
     System.out.println("Time taken : " + time + " ms."); 
    } 
+0

也许它只是Neo4j的引导开销,你应该尝试重复查询多次,在这种情况下,我认为执行时间应该是显著降低。 – remigio 2013-03-15 08:06:10

+0

首先尝试预热高速缓存。运行这个命令几次:'start n = node(*)return count(n); start r = rel(*)return count(r)'。第二,你如何衡量时间?这是由密码输出给出的时间还是仅仅是特定代码行之前和之后的时间?在第二种情况下,延迟可能在您的应用程序和服务器之间 – ulkas 2013-03-15 08:22:51

+0

好吧,这里是它的行为 - 我已经测量了第二次查询执行的时间(期待第一次执行会初始化内部缓存等)。但这里有所不同。这是第三次执行它需要更少的时间。我没有得到相同查询的第三次执行的特别之处。 remigio感谢您的提示,ulkas,我在嵌入模式下使用 – Shilu 2013-03-15 08:43:11

回答

0

你可能想索引你的name属性(见indexing)。在这之后,你可以查询这样的:

START n=node:your_index_name("name:the_indexed_name") RETURN n; 

查找了通过索引节点将会快很多不是通过WHERE子句过滤。

+0

是的,我知道这一点。该查询仅用于实验目的 - 查看其行为。 – Shilu 2013-03-15 08:45:08

+0

嗨@tstorms,我有neo4j类似的问题。我用索引创建了一些节点并将它与关系连接起来。现在,当我试图获得相互支持时,它表现得非常缓慢。我的查询花了大约2-3秒从neo4j获取大约150条记录。 – 2013-07-18 12:59:27