基于两个不同节点之间的关系查询节点



我有一个图,它有两个不同类型的节点a和B,通过关系rel连接。它的存在使得a的多个节点可能连接到B中的一个。我的确切问题是,假设我有两个类型A的节点a1、a2通过关系rel连接到b1。我想找到一个包含a1、a2和a3的节点b3,然后在b3和b2、b1之间形成关系,如果它们满足一个属性(b3.prop/b2.prop>x&b3.prp/b1.prop>x(。有可能用密码写一个查询来处理这样的多个关系吗?

这可能适用于您的场景:

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,并且如果存在任何适当的b3节点,则仅返回结果。它首先创建与b1相关的A节点相关的所有可能的Bcandidates的列表。然后,它缩减candidates列表,只保留与b2相关的A节点也相关的B节点。

这个查询中有许多细微差别。例如,如果b1具有rel关系的任何A节点与某些其他B节点(与b1b2不同(不具有rel关系,则此代码段将中止查询:

MATCH (a1)-[:rel]->(b1)
MATCH (a1)-[:rel]->(y1:B)
WHERE y1 <> b1 AND y1 <> b2

然而,如果所有与b1具有rel关系的A节点与某些其他B节点(与b1b2不同(也不具有rel关系,则上述代码段的以下重构仅会中止查询:

MATCH (y1:B)<-[:rel]-(a1)-[:rel]->(b1)
WHERE y1 <> b1 AND y1 <> b2

最新更新