我遇到了查询性能问题。如果我在这里犯了任何错误,请告诉我。
我创建了大约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"
我增加了服务器的堆大小,这需要花费很多时间
如果我错过了什么,请告诉我。 如果您需要日志,请告诉我。
答案 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
进行诊断。