根据两个不同节点之间的关系查询节点

时间:2020-07-22 11:38:25

标签: neo4j cypher

我有一个图,其中有两个不同类型的节点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编写查询来处理这样的多个关系?

1 个答案:

答案 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节点。

此查询有许多细微差别。例如,如果与b2A关系的任何 rel个节点也没有与b1关系有关系,则此代码段将中止查询其他rel个节点(与Bb1不同):

b2

鉴于上述摘要的以下重构只有在与MATCH (a1)-[:rel]->(b1) MATCH (a1)-[:rel]->(y1:B) WHERE y1 <> b1 AND y1 <> b2 A关系的所有 rel个节点也没有b1与其他rel节点的关系(与Bb1不同):

b2