在Cypher查询中选择两个节点之一

时间:2018-08-28 07:50:21

标签: neo4j cypher

所有Cypher大师!

在选择BB1B2B4时,我不知道如何查询所有B5节点。对它们中的哪一个没有限制,仅选择一个即可。如图所示,存在一个关系(B1,B2)和(B4,B5)。

换句话说-我想MATCH类型为B的所有节点连接到类型为A的某个节点,但不包括B1B2以及结果中的B4B5(使用它们之间的关系)。类型B的节点只能成对连接-即,不会同时存在(B1,B2),(B2,B3)。虽然,如图所示,可以有多于一对。

任何想法都值得欢迎!

enter image description here

2 个答案:

答案 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