所有Cypher大师!
在选择B
或B1
和B2
或B4
时,我不知道如何查询所有B5
节点。对它们中的哪一个没有限制,仅选择一个即可。如图所示,存在一个关系(B1,B2)和(B4,B5)。
换句话说-我想MATCH
类型为B
的所有节点连接到类型为A
的某个节点,但不包括B1
或B2
以及结果中的B4
或B5
(使用它们之间的关系)。类型B
的节点只能成对连接-即,不会同时存在(B1,B2),(B2,B3)。虽然,如图所示,可以有多于一对。
任何想法都值得欢迎!
答案 0 :(得分:2)
我认为这是一个简单的附加条件:
MATCH (A:A)--(B:B)
OPTIONAL MATCH (B)--(BT:B)--(A)
WITH B WHERE BT IS NULL OR id(B) > id(BT)
RETURN B
答案 1 :(得分:0)
为此,使用APOC程序会更快,因为这里有一些有用的收集功能,而我们希望该程序可以轻松地获得一组节点之间存在的关系。
这里的想法是,我们将匹配连接的:B节点,使用cover()
过程获取这些节点之间的所有关系,收集这些关系,并从那些节点中获取这些关系中的一个(我们将在此处使用startnode),然后从列表中减去那些选择的节点,剩下我们想要的:B节点:
MATCH (a:A)--(b:B)
WITH collect(b) as bNodes
CALL apoc.algo.cover(bNodes) YIELD rel
WITH bNodes, [r in collect(rel) | startNode(r)] as toRemove
RETURN apoc.coll.subtract(bNodes, toRemove) as nodes
如果您没有(或不想使用)APOC,这是一个仅适用于Cypher的版本:
MATCH (a:A)--(b:B)
WITH collect(b) as bNodes
UNWIND bNodes as b
OPTIONAL MATCH (b)-[r]-(other)
WHERE other IN bNodes
WITH bNodes, collect(DISTINCT startNode(r)) as toRemove
RETURN [b in bNodes WHERE NOT b in toRemove] as nodes