2014-04-09 156 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