Neo4j中的完全外部连接

Neo4j中的完全外部连接,neo4j,cypher,Neo4j,Cypher,Neo4j是否支持完全外部联接?我读过关于可选匹配的文章,但我不能让它在我的场景中发挥作用 具体来说,我有一个包含5种实体类型的Neo4j模式,其中某些类型可以通过无向连接相互连接。允许的连接有(类型1,类型2),(类型2,类型3),(类型3,类型4)和(类型4,类型5)。连接不是定向的。我想在这些类型之间执行等效的完全外部联接。e、 g.如果唯一的连接是e11:Type1--e21:Type2,e22:Type2--e31:Type3,e32:Type3--e41:Type4和e42:Type

Neo4j是否支持完全外部联接?我读过关于可选匹配的文章,但我不能让它在我的场景中发挥作用

具体来说,我有一个包含5种实体类型的Neo4j模式,其中某些类型可以通过无向连接相互连接。允许的连接有(类型1,类型2),(类型2,类型3),(类型3,类型4)和(类型4,类型5)。连接不是定向的。我想在这些类型之间执行等效的完全外部联接。e、 g.如果唯一的连接是
e11:Type1--e21:Type2
e22:Type2--e31:Type3
e32:Type3--e41:Type4
e42:Type4:e51:Type5
,则完整的外部连接应导致:

类型1 类型2 类型3 类型4 类型5 e11 e21 无效的 无效的 无效的 无效的 e22 e31 无效的 无效的 无效的 无效的 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, n2, n3, n4, n5

UNION

MATCH (n2:Type2)--(n3:Type3)
OPTIONAL MATCH (n2)--(n1:Type1)
OPTIONAL MATCH (n3)--(n4:Type4)
OPTIONAL MATCH (n4)--(n5:Type5)
WITH n1, n2, n3, n4, n5
WHERE n1 IS NULL AND n4 IS NULL
RETURN n1, n2, n3, n4, n5

UNION

MATCH (n3:Type3)--(n4:Type4)
OPTIONAL MATCH (n3)--(n2:Type2)
OPTIONAL MATCH (n2)--(n1:Type1)
OPTIONAL MATCH (n4)--(n5:Type5)
WITH n1, n2, n3, n4, n5
WHERE n2 IS NULL AND n5 IS NULL
RETURN n1, n2, n3, n4, n5

UNION

MATCH (n4:Type4)--(n5:Type5)
OPTIONAL MATCH (n4)--(n3:Type3)
OPTIONAL MATCH (n3)--(n2:Type2)
OPTIONAL MATCH (n2)--(n1:Type1)
WITH n1, n2, n3, n4, n5
WHERE n3 IS NULL
RETURN n1, n2, n3, n4, 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

这个模式是否总是期望的序列?如果是这样,您可以考虑为每个类型添加占位符节点来表示null,但是可以继续链接到给定类型的下一个节点。通过这种方式,匹配可以从空占位符节点开始并继续链。这很有帮助,但请注意,我不需要强制所有元素都为空,只有两个除外(这只是一个示例)。我想如果你只是从每个联合元素中删除WITH和WHERE子句,我就能够接受答案(假设一两天内没有更简洁的内容出现),这会让事情变得更容易一些。请参阅我的最新答案。但是,如果没有
UNION
,我仍然无法找到一个更动态、更短的查询。