可选匹配未返回预期结果

时间:2016-03-28 15:10:12

标签: neo4j

我有一个以下查询(第一个简化以显示问题)

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" ) 
RETURN recEmployee

它不会返回任何内容。 如果我删除第三个可选匹配,那么它工作正常。这是一个错误吗?我认为这意味着可选。

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

1 个答案:

答案 0 :(得分:0)

[EDITED]

这不是错误。该行为来自两个因素:

  • 单个MATCHOPTIONAL MATCH子句将过滤掉重复的关系,
  • 您的OPTIONAL MATCH有多种模式,其中包含涉及2个特定节点之间关系的完全相同的子模式。

子模式(recEmployee:RecordEmployee)-[:Reference{Id:'F08'}]-(recComputer_F08:RecordComputer)在单个OPTIONAL MATCH内以2种模式重复。由于第二个实例也会找到第一个模式实例找到的任何Reference关系,neo4j将过滤掉所有结果行。这就是您的第一个查询没有结果的原因。

您需要避免在同一MATCHOPTIONAL MATCH子句中的多个模式中重复相同的子模式(在相同的2个节点之间涉及相同的关系类型)。