2014-04-09 154 views
1

我正面臨查詢性能問題。如果我在這裏犯了什麼錯誤,請告訴我。neo4j查詢性能需要很長時間

我創建了大約1700個(路由器節點)和大約4000個(接口節點),其中接口使用關係(has_interface)連接到各自的路由器。

現在我想創建這些接口之間的鏈接。鏈接將是一種關係。每個接口都有一個與之關聯的IfIPAddress屬性。 當我嘗試使用此查詢創建鏈接時,它運行很長時間,佔用大量CPU,然後不創建任何鏈接。 這裏是我的查詢

MATCH (I:Interface), (I2:Interface)        
FOREACH(p in FILTER(z in {props} WHERE z.OrigIPAddress = I.IfIPAddress and z.TermIPAddress = I2.IfIPAddress) | 
MERGE (:Interface {IfIPAddress:p.OrigIPAddress})-[r:link]->(:Interface {IfIPAddress:p.TermIPAddress}) 
ON CREATE SET r = p 
ON MATCH SET r = p) 

以下是我提供了使用JSON來的Neo4j和捲曲

{ 
    "params" : { 
     "props" : [ 
     { 
      "AreaId" : "", 
      "OrigIPAddress" : "172.16.42.9", 
      "OrigNodeID" : "192.168.1.221", 
      "TermIPAddress" : "172.16.42.10", 
      "TermNodeID" : "10.229.140.28", 
      "eEntityStatus" : "1", 
      "iTotalBW" : "0" 
     } 
     ] 
    }, 
    "query" : "MATCH (I:Interface), (I2:Interface)        FOREACH(p in FILTER(z in {props} WHERE z.OrigIPAddress = I.IfIPAddress and z.TermIPAddress = I2.IfIPAddress) |        MERGE (:Interface {IfIPAddress:p.OrigIPAddress})-[r:link]->(:Interface {IfIPAddress:p.TermIPAddress})        ON CREATE SET r = p        ON MATCH SET r = p)" 
} 

這是我在查詢 首先在我刪除這些鏈接的過濾器正在做其中的OrigIPAddress或TermIPAddress不在neo4j中 之後,對於每個道具,我在這些接口之間創建一個鏈接。

我正在使用neo4j 2.1。當Neo4j的服務器按照默認配置運行它給了錯誤的「OutOfMemory例外」

我增加了服務器的堆大小,它是採取了很多時間

讓我知道如果有什麼我已經錯過了。 如果您需要日誌,請告訴我。

回答

1

首先:您的查詢創建了一個跨產品,即它拉入8M對。

先嚐試類似這樣的事情,如果不起作用就回報。

FOREACH(p in {props} | 
    MERGE (I:Interface{IfIPAddress:p.OrigIPAddress}) 
    MERGE (I2:Interface {IfIPAddress:p.TermIPAddress}) 
    MERGE (I)-[r:link]->(I2) 
    SET r = p 
) 

你不應該將所有的r這只是一個浪費的屬性。只在那裏設置你真正需要的屬性。

相反的:

SET r = p 

做這樣的事情:

SET r.uptime = p.uptime 

多少元素,你在{props}有嗎?

您當前的服務器配置是什麼?在堆,毫米等?

最好分享path/to/neo4j/data/graph.db/messages.log進行診斷。

+0

在您的查詢中,根據我的理解,如果原始地址不存在,我不想要查詢目的是創建鏈接而不是接口,則第一次合併將創建接口(I)。 我想在r中設置所有的道具,但我不認爲這會影響太多,因爲它只是設置。 嗯,我只嘗試過一個元素,它花了很多時間。雖然道具元素的數量約爲10000-20000 – Nipun

+0

我試過你的查詢和相同的結果。 在消息中。記錄這是唯一重複多次的消息。 2014-04-09 11:38:57.155 + 0000 WARN [onkEmbeddedGraphDatabase]:GC Monitor:應用程序線程被阻塞了額外的7971ms [總阻塞時間:143.898s 這些都是我已經改變了\加 最大堆4096 MB org.neo4j.server.transaction.timeout = 5000 neostore.nodestore.db.mapped_memory = 90M neostore.relationshipstore.db.mapped_memory = 3G neostore.propertystore.db.mapped_memory = 90M neostore.propertystore.db.strings.mapped_memory = 130M neostore.propertystore.db.arrays.mapped_memory = 130M – Nipun

+0

另外,添加我的Web控制檯在我運行這些查詢時停止工作。 它顯示紅色的錯誤說「斷開......請檢查您的插座...類似的東西」 – Nipun