2013-03-15 91 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