首页 > 解决方案 > NEO4J:在没有联合匹配的情况下与 WHERE ALL 组合(列表中的 x WHERE x 在另一个列表中)

问题描述

我希望有一种方法可以在没有 UNION MATCH 的情况下做到这一点。这是一个更大的查询的一部分,我不想退出它。

我有一个 n 节点列表和一个 x 节点列表。我想排除任何与 xlist 中的 x 节点没有关系的 n,而是通过两种不同的关系,其中一个有标签。

WITH nlist, xlist
OPTIONAL MATCH (n1:Label)-[:FIRST]->(x1) WHERE n1 in nlist AND ALL (y in collect(x1) WHERE y in xlist)
OPTIONAL MATCH (n2)<-[:SECOND]-(x2) WHERE n2 in nlist AND ALL (z in collect(x2) WHERE z in xlist)
WITH collect (n1) + collect(n2) as n....(unwind as n)

这不起作用,因为它完全不喜欢收集 x。

WITH n, xlist,
[(n:Label)-[:FIRST]->(x1) | x1] + [(n)<-[:SECOND]-(x2) | x2] as allx
WHERE ALL (x in allx WHERE x in xlist)
WITH n ...

这是行不通的,因为 n 可能没有两种类型的关系,而且看起来所有人都希望它两者兼而有之。

感谢任何指针。

谢谢!

----附录虚拟输入/输出:

MERGE (n1:Label {n: 1})-[:FIRST]->(xa {x: "a"})
MERGE (n2:Label {n: 2})-[:FIRST]->(xa)
MERGE (n3:Label {n: 3})-[:FIRST]->(xa)
MERGE (n2)-[:FIRST]->(xb {x: "b"})
MERGE (n3)-[:FIRST]->(xb)
MERGE (n2)-[:FIRST]->(xa)
MERGE (n2)-[:FIRST]->(xb)
MERGE (n2)<-[:SECOND]-(xa)
MERGE (n3)<-[:SECOND]-(xc {x: "c"})
RETURN n1, n2, n3, xa, xb, xc

给定 ["n1", "n2", "n3"] 的 nlist:

当 xlist 为“a”时,预期结果为 n1

当 xlist 为 ["a", "b"] 时,预期结果为 n1, n2

当 xlist 为 ["a", "b", "c"] 或 ["a", "b", "c", "d"] 时,预期结果为 n1, n2 和 n3

当 xlist 为 ["d"] 或 ["a", "d"] 时,预期结果为 null

标签: neo4j

解决方案


推荐阅读