Neo4j 可选匹配未返回预期结果
我有一个以下查询(第一个查询经过简化以显示问题) 它不会返回任何东西。 如果我删除了第三个可选匹配项,那么它可以正常工作。是虫子吗?我在想这只是一种选择Neo4j 可选匹配未返回预期结果,neo4j,Neo4j,我有一个以下查询(第一个查询经过简化以显示问题) 它不会返回任何东西。 如果我删除了第三个可选匹配项,那么它可以正常工作。是虫子吗?我在想这只是一种选择 OPTIONAL MATCH (recEmployee:RecordEmployee)-[:Reference{Id:'F08'}]-(recComputer_F08:RecordComputer)-[:Reference{Id:'F09'}]-(recIncidents_F08_F09:RecordIncidents), (recEmploy
OPTIONAL MATCH (recEmployee:RecordEmployee)-[:Reference{Id:'F08'}]-(recComputer_F08:RecordComputer)-[:Reference{Id:'F09'}]-(recIncidents_F08_F09:RecordIncidents),
(recEmployee:RecordEmployee)
WHERE ( recIncidents_F08_F09.F01="Trojan" )
RETURN recEmployee
好的,我不想混淆这个问题,但是人们当然开始谈论重复路径什么的。我认为可选匹配不会返回任何东西这一事实是一个错误,也许有人有解决办法。这是一个完整的查询,当它应该返回2个节点时,它什么也不返回
OPTIONAL MATCH (recEmployee:RecordEmployee)-[:Reference{Id:'F08'}]-(recComputer_F08:RecordComputer)-[:Reference{Id:'F09'}]-(recIncidents_F08_F09:RecordIncidents),
(recEmployee:RecordEmployee),
(recEmployee:RecordEmployee)-[:Reference{Id:'F08'}]-(recComputer_F08:RecordComputer)
WHERE ( recIncidents_F08_F09.F01="Trojan" ) OR (recComputer_F08.F02="WSMYSTATION")
RETURN recEmployee
[已编辑]
这不是一个bug。这种行为是由两个因素造成的:
- 单个
或匹配
子句将筛选出重复的关系,并且可选匹配
- 您的
具有多个模式,这些模式包含相同的子模式,涉及两个特定节点之间的关系可选匹配
(recEmployee:RecordEmployee)-[:Reference{Id:'F08'}]-(recComputer\u F08:RecordComputer)
在一个可选匹配中以两个模式重复。由于模式的第一个实例找到的任何引用
关系也将由第二个实例找到,因此neo4j将过滤掉所有结果行。这就是为什么第一个查询没有结果
您需要避免在同一MATCH
或OPTIONAL MATCH
子句中的多个模式中重复相同的子模式(涉及相同2个节点之间的相同关系类型)。编写可选查询(第二个)的正确方法
可选匹配(recEmployee:RecordEmployee)-[:引用{Id:'F08'}]-(recComputer\U F08:RecordComputer)-[:引用{Id:'F09'}]-(recIncidents\U F08\U F09:RecordIncidents)
其中(recIncidents_F08_F09.F01=“特洛伊木马”)
返聘
联盟
可选匹配(recEmployee:RecordEmployee)-[:引用{Id:'F08'}]-(recComputer\U F08:RecordComputer)
其中(recComputer_F08.F02=“WS-MRSPFRY02”)
不幸的是,经过长时间的研究后,不同的路径与或仅与union相关。1。我不能,这是一个简化的查询。完整查询有一个查找计算机名的or子句。所以两条可选路径都应该存在。2.删除重复项并不能解释删除所有重复项。在哪种情况下,distinct(1,1)返回null?1。为什么必须在同一查询中重复相同的子模式?2.我不明白你的意思。我把这个问题添加到了原来的帖子中,它解释了这一点。它在底部。这个问题与WHERE
子句无关。问题在于OPTIONAL MATCH
子句,它在您刚才添加到底部的查询中没有改变。我已经编辑了我的答案,希望能使问题更清楚。
OPTIONAL MATCH (recEmployee:RecordEmployee)-[:Reference{Id:'F08'}]-(recComputer_F08:RecordComputer)-[:Reference{Id:'F09'}]-(recIncidents_F08_F09:RecordIncidents),
(recEmployee:RecordEmployee),
(recEmployee:RecordEmployee)-[:Reference{Id:'F08'}]-(recComputer_F08:RecordComputer)
WHERE ( recIncidents_F08_F09.F01="Trojan" ) OR (recComputer_F08.F02="WSMYSTATION")
RETURN recEmployee