neo4j查询性能需要花费大量时间

时间:2014-04-09 09:49:16

标签: json 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和curl

为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)"
}

这就是我在查询中所做的事情 首先在FILTER中我删除所有那些在neo4j中不存在OrigIPAddress或TermIPAddress的链接 在每个道具之后,我在界面之间创建一个链接。

我正在使用neo4j 2.1。当neo4j服务器使用默认配置运行时,它给出了错误" OutOFMemory Exception"

我增加了服务器的堆大小,这需要花费很多时间

如果我错过了什么,请告诉我。 如果您需要日志,请告诉我。

1 个答案:

答案 0 :(得分: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}中有多少元素?

您当前的服务器配置是什么?在堆,mmio等方面?

最好分享path/to/neo4j/data/graph.db/messages.log进行诊断。