Neo4j 中的全外连接

问题描述

Neo4j 是否支持完全外部联接?我阅读了有关 Optional Match 的内容,但我无法让它完全适用于我的场景。

具体来说,我有一个包含 5 种实​​体类型的 Neo4j 模式,其中某些类型可以通过无向连接相互连接。允许的连接是 (Type1,Type2),(Type2,Type3),(Type3,Type4) 和 (Type4,Type5)。连接不是定向的。我想在这些类型之间执行等效的完全外连接。例如如果仅有的连接是 e11:Type1--e21:Type2e22:Type2--e31:Type3e32:Type3--e41:Type4e42:Type4:e51:Type5,那么完整的外连接应该导致:

Type1 Type2 Type3 Type4 Type5
e11 e21
e22 e31​​td>
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