【问题标题】:Full outer join in Neo4jNeo4j 中的完全外连接
【发布时间】:2021-02-22 08:02:00
【问题描述】:

Neo4j 支持完全外连接吗?我阅读了有关可选匹配的信息,但我无法让它适用于我的场景。

具体来说,我有一个包含 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 null null null
null e22 e31 null null
null null e32 e41 null
null null null e42 e51

【问题讨论】:

  • 这种模式是否始终是所需的序列?如果是这样,您可能会考虑为每种类型添加占位符节点以表示空值,但可以继续链接到给定类型的下一个节点。这样一来,MATCH 可以从空占位符节点开始并继续链。

标签: neo4j cypher


【解决方案1】:

我想不出比查找每个类型对、检查它们是否未连接到其他类型、然后将每个子查询与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

【讨论】:

  • 这很有帮助,但请注意,我不需要强制所有元素都为空,除了两个(这只是一个示例)。我认为,如果您只是从每个联合元素中删除 WITH 和 WHERE 子句,我将能够接受答案(假设一两天内没有更简洁的内容出现)。
  • 这使它更容易一些。请参阅我的更新答案。但是,如果没有UNION,我仍然无法找到更动态、更短的查询。
猜你喜欢
  • 2010-09-20
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 2013-03-11
  • 2022-01-01
  • 2022-01-16
相关资源
最近更新 更多