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