2016-06-21 83 views
0

我有什么感觉像一个相当简单的Cypher问题。Cypher:排除共享节点?

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

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

CREATE (n:A { code: 'a1' }) 
CREATE (n:A { code: 'a2' }) 
CREATE (n:B { code: 'b1' }) 
CREATE (n:B { code: 'b2' }) 
CREATE (n:B { code: 'b3' }) 

match (a:A), (b:B) where a.code = 'a1' and b.code = 'b1' create (a)<-[r:A_AND_B]-(b) return a, r, b 
match (a:A), (b:B) where a.code = 'a2' and b.code = 'b2' create (a)<-[r:A_AND_B]-(b) return a, r, b 
match (a:A), (b:B) where a.code = 'a1' and b.code = 'b3' create (a)<-[r:A_AND_B]-(b) return a, r, b 
match (a:A), (b:B) where a.code = 'a2' and b.code = 'b3' create (a)<-[r:A_AND_B]-(b) return a, r, b 

如果我愿意,包括共享B3节点,查询将是直线前进,并为:

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

返回b1和b2。然而,鉴于我确实想要包含与不同A节点相关的任何B节点(本例中不应返回b2),我正在努力想出正确的方法和语法。

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

有人可以提供一个提升?

回答

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 
+0

这正是我所需要的提升;谢谢你的帮助。 –