Neo4j查询优化 - 15个差异标签

时间:2014-10-06 16:50:01

标签: optimization neo4j cypher

所以我在Neo4j中有15个不同的标签代表15个真实世界的商业对象。所有这些对象都是相互关联的。每个对象(标签)都有数千个节点。我想要做的是在所有这些标签之间进行可选匹配并获取相关数据。所有15个选中的查询运行速度极慢,并且可以使用3-4种对象类型。

所以通常这是具有较少对象类型的查询,它可以正常工作。

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种不同对象类型之间的相关数据时,它运行得非常慢。您有什么建议我可以解决这个问题

1 个答案:

答案 0 :(得分: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

在此查询中,一旦找到事件,下一个匹配就是搜索特定事件的关系以查找匹配的设备。找到后,匹配警报的方式也会受到限制。

此外,如果您为每个关系设置了不同的关系类型(设备事件,设备报警,事件报警等),使用匹配中关系类型的规范将进一步加快速度,因为它将再次减少必须搜索的项目数量。如果没有关系类型,将测试与具有错误标签的节点的关系。

我不知道这是否是故意的,但你也在匹配你的例子中的闭环。如果你小心不允许匹配循环发生,这不是问题,但如果没有闭环,查询就不会成功。只是想我会指出它。