我有一个图,其中有两个不同类型的节点A和B通过关系rel连接。它的存在使得A的多个节点连接到B之一。 我的确切问题是,假设我有2个类型为A的节点a1,a2通过rel关系连接到b1。我有与节点b2相关的类型A的节点a3。我想找到一个包含a1,a2和a3的节点b3,然后在b3和b2,b1之间实现满足属性的关系(b3.prop / b2.prop> x&b3.prop / b1.prop> x )。是否可以用cypher编写查询来处理这样的多个关系?
答案 0 :(得分:1)
这可能适合您的情况:
MATCH (b1:B), (b2:B)
WHERE b1.id = 123 AND b2.id = 456
MATCH (a1:A)-[:rel]->(b1)
MATCH (a1)-[:rel]->(y1:B)
WHERE y1 <> b1 AND y1 <> b2
WITH b2, COLLECT(DISTINCT a1) AS a1s, COLLECT(DISTINCT y1) AS otherBs
WITH b2, [b IN otherBs WHERE ALL(a IN a1s WHERE (a)-[:rel]->(b))] AS candidates
WHERE SIZE(candidates) > 0
MATCH (a2:A)-[:rel]->(b2)
WITH candidates, COLLECT(a2) AS a2s
UNWIND [c IN candidates WHERE ALL(a IN a2s WHERE (a)-[:rel]->(c))] AS b3
RETURN b3
此查询假设rel
关系从A
指向B
,并且如果存在任何适当的{{1 }}节点。它首先创建与b3
相关的B
节点相关的所有可能candidates
A
的列表。然后,它缩小b1
列表,仅保留也与candidates
相关的B
节点相关的A
节点。
此查询有许多细微差别。例如,如果与b2
有A
关系的任何 rel
个节点也没有与b1
关系有关系,则此代码段将中止查询其他rel
个节点(与B
和b1
不同):
b2
鉴于上述摘要的以下重构只有在与MATCH (a1)-[:rel]->(b1)
MATCH (a1)-[:rel]->(y1:B)
WHERE y1 <> b1 AND y1 <> b2
有A
关系的所有 rel
个节点也没有b1
与其他rel
节点的关系(与B
和b1
不同):
b2