Cypher:排除共享节点?

时间:2016-06-21 17:56:16

标签: neo4j cypher

我感觉这是一个相当简单的Cypher问题。

我有以下数据,其中我有两个A节点和3个B节点,其中b1与a1相关,b2与a2相关,b3是共享的,与a1和a2都相关。我的目标是编写一个Cypher语句,给定一个特定的A节点,它将返回仅与其连接的B节点,并且与任何其他A节点无关。例如,当给定节点a1时,查询应返回b1,当给定节点a2时,应返回b2。无论指定了哪个A节点,都不应从此查询返回与a1和a2都相关的b3节点。换句话说,我试图找到给定A节点唯一的B节点,因为生成的B节点与我匹配中指定的节点之外的任何其他节点都没有关系。

这个示例数据将(希望)使我的目标更加明确:

{{1}}

如果我愿意包含共享的b3节点,那么查询将是直接的,并且是:

匹配(a:A) - [r:A_AND_B] - (b:B)其中a.code =' a1'返回b

返回b1和b2。但是,鉴于我确实想要包含任何与不同A节点相关的B节点(在这种情况下不应该返回b2),我很难想出正确的方法和语法。

我已经探索过探索Cypher的WITH和OPTIONAL MATCH到目前为止没有运气。如果我使用两个单独的查询,我也能够完成我想要的任务,这有​​点像作弊并避开学习机会。

有人可以提升吗?

1 个答案:

答案 0 :(得分:1)

这样的事情怎么样:

match (a:A)-[:A_AND_B]-(b:B) 
where a.code = 'a1' 
match (b)-[r:A_AND_B]-(:A) 
with b, count(r) as c 
where c = 1 
return b