我有什么感觉像一个相当简单的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,到目前为止还没有运气。如果我使用两个单独的查询,我也能够完成我想要的任务,这有点欺骗并且避开了学习机会。
有人可以提供一个提升?
这正是我所需要的提升;谢谢你的帮助。 –