问题描述
Neo4j 是否支持完全外部联接?我阅读了有关 Optional Match 的内容,但我无法让它完全适用于我的场景。
具体来说,我有一个包含 5 种实体类型的 Neo4j 模式,其中某些类型可以通过无向连接相互连接。允许的连接是 (Type1,Type2),(Type2,Type3),(Type3,Type4) 和 (Type4,Type5)。连接不是定向的。我想在这些类型之间执行等效的完全外连接。例如如果仅有的连接是 e11:Type1--e21:Type2
、e22:Type2--e31:Type3
、e32:Type3--e41:Type4
和 e42:Type4:e51:Type5
,那么完整的外连接应该导致:
Type1 | Type2 | Type3 | Type4 | Type5 |
---|---|---|---|---|
e11 | e21 | 空 | 空 | 空 |
空 | e22 | e31td> | 空 | 空 |
空 | 空 | e32 | e41 | 空 |
空 | 空 | 空 | e42 | e51 |
解决方法
我想不出比查找每个类型对更好的查询,检查它们没有连接到其他类型,然后将每个子查询与 UNION
组合。这会导致一个相当大的查询。也许其他人可以想到一个更动态的查询。
MATCH (n1:Type1)--(n2:Type2)
OPTIONAL MATCH (n2)--(n3:Type3)
OPTIONAL MATCH (n3)--(n4:Type4)
OPTIONAL MATCH (n4)--(n5:Type5)
WITH n1,n2,n3,n4,n5
WHERE n3 IS NULL
RETURN n1,n5
UNION
MATCH (n2:Type2)--(n3:Type3)
OPTIONAL MATCH (n2)--(n1:Type1)
OPTIONAL MATCH (n3)--(n4:Type4)
OPTIONAL MATCH (n4)--(n5:Type5)
WITH n1,n5
WHERE n1 IS NULL AND n4 IS NULL
RETURN n1,n5
UNION
MATCH (n3:Type3)--(n4:Type4)
OPTIONAL MATCH (n3)--(n2:Type2)
OPTIONAL MATCH (n2)--(n1:Type1)
OPTIONAL MATCH (n4)--(n5:Type5)
WITH n1,n5
WHERE n2 IS NULL AND n5 IS NULL
RETURN n1,n5
UNION
MATCH (n4:Type4)--(n5:Type5)
OPTIONAL MATCH (n4)--(n3:Type3)
OPTIONAL MATCH (n3)--(n2:Type2)
OPTIONAL MATCH (n2)--(n1:Type1)
WITH n1,n5
更新:
无需返回 NULL
即可缩短查询:
MATCH (n1:Type1)--(n2:Type2)
WHERE NOT (n2)--(:Type3)
RETURN n1,n2
UNION
MATCH (n1:Type2)--(n2:Type3)
WHERE NOT (n1)--(:Type1) AND NOT (n2)--(:Type4)
RETURN n1,n2
UNION
MATCH (n1:Type3)--(n2:Type4)
WHERE NOT (n1)--(:Type2) AND NOT (n2)--(:Type5)
RETURN n1,n2
UNION
MATCH (n1:Type4)--(n2:Type5)
WHERE NOT (n1)--(:Type3)
RETURN n1,n2