我有一个图,它有两个不同类型的节点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
节点相关的所有可能的B
candidates
的列表。然后,它缩减candidates
列表,只保留与b2
相关的A
节点也相关的B
节点。
这个查询中有许多细微差别。例如,如果与b1
具有rel
关系的任何A
节点与某些其他B
节点(与b1
和b2
不同(不具有rel
关系,则此代码段将中止查询:
MATCH (a1)-[:rel]->(b1)
MATCH (a1)-[:rel]->(y1:B)
WHERE y1 <> b1 AND y1 <> b2
然而,如果所有与b1
具有rel
关系的A
节点与某些其他B
节点(与b1
和b2
不同(也不具有rel
关系,则上述代码段的以下重构仅会中止查询:
MATCH (y1:B)<-[:rel]-(a1)-[:rel]->(b1)
WHERE y1 <> b1 AND y1 <> b2