2014-10-06 39 views
0

因此,我在Neo4j中有15个不同的标签,代表了15个真实世界的业务对象。所有这些对象都是相互关联的。每个对象(标签)都有数千个节点。我想要做的是在所有这些标签之间进行可选匹配并获取相关数据。该查询运行速度非常缓慢,全部15个选定,并与3-4对象类型正常工作。Neo4j查询优化 - 15个差异标签

因此,通常这是使用较少的对象类型的查询工作正常。

MATCH (incident:Incidents) 
WHERE incident.incident_number IN ["INC000005590903","INC000005590903"] 
MATCH (device:Devices) 
WHERE device.deviceid_udr in ["RE221869491800Uh_pVAevJpYAhRcJ"] 
MATCH (alarm:Alarms) 
WHERE alarm.entryid_udr in ["ALM123000000110"] 
MATCH incident-[a]-alarm 
MATCH device-[b]-alarm 
MATCH incident-[c]-device 
RETURN incident.incident_number, device.deviceid,alarm.entryid_udr 

当我做查询以查找15种不同对象类型之间的相关数据时,它运行速度非常慢。你有什么建议,我可以如何解决这个问题

+0

您是否拥有Incidents.incident_number,Devices.deviceid_udr和Alarms.entryid_udr上的索引? – JohnMark13 2014-10-06 18:00:22

+0

是的,我在所有这些领域添加了索引。 – ajinkhya 2014-10-06 19:48:26

+0

到目前为止,您添加的内容应该很慢(甚至可以扩展),您可以发布无法正常工作的查询吗?慢多慢? – JohnMark13 2014-10-06 20:37:56

回答

1

当你分析你的查询发生了什么,它不难看出为什么它很慢。您的每个初始匹配都与其他匹配无关,因此每个标签的整个域都会被搜索到。如果您事先使用关系匹配,则可以显着减少执行查询所需的每个时间的大小。

尝试此查询,看看它是如何进行比较与你的问题。

MATCH (incident:Incidents {incident_number : "INC000005590903"}) 
WITH incident 
MATCH (incident)--(device:Devices {deviceid_udr : "RE221869491800Uh_pVAevJpYAhRcJ"}) 
WITH incident, device 
MATCH (device)--(alarm:Alarms {entryid_udr : "ALM123000000110"}) 
WITH incident, device, alarm 
MATCH (incident)--(alarm) 
RETURN incident.incident_number, device.deviceid_udr, alarm.entryid_udr 

在此查询中,一旦找到事件,下一个匹配就是搜索特定事件上的关系以查找匹配设备。一旦找到了,匹配警报的方式就会受到限制。此外,如果您对每个关系(事件到设备,设备到报警,事件报警等)有不同的关系类型,那么使用匹配关系类型的规范将会加快甚至提高速度此外,因为它将再次减少必须搜索的项目数量。如果没有关系类型,将会测试与标签错误的节点的关系。

我不知道它是否是有意或无意的,但在您的示例中您也是匹配闭环。如果小心不要让匹配循环发生,那么这不是问题,但如果没有闭环,查询就不会成功。只是想我会指出。

+0

我没有写这个的原因是我想知道IN子句是否需要在较大的(断开的)查询中,否则完全同意。 – JohnMark13 2014-10-06 21:04:32

+1

是的,我也想知道这个部分(是否有任何这些关卡需要多个匹配),但我认为如果事实证明是这样的话,我们可以攻击它。 – 2014-10-07 02:39:12