Neo4j - Cypher返回1比1的关系

时间:2013-11-09 11:12:22

标签: neo4j cypher

使用neo4j 1.9.2,我试图找到我的图中与另一个节点有一对一关系的所有节点。假设我的图表中有人,我想找到所有人,只有一个朋友(自2013年起),这个朋友只有另一个人作为朋友而没有其他人。作为回报,我想拥有所有这些“孤立”的朋友。

我尝试了以下内容:

START n=node(*) MATCH n-[r:is_friend]-m-[s:is_friend]-n
WHERE r.since >= 2013 and s.since >= 2013
WITH n, m, count(r), count(s)
WHERE count(r) = 1 AND count(s) = 1
RETURN n, m

但是这个查询并不是它应该做的 - 它只是不返回任何内容。

注意:两个人之间只存在一种关系。因此,一个朋友有一个传入的关系,另一个朋友有一个传出的关系。此外,这两个人可能还有其他一些关系,比如“works_in”左右,但我只是想检查一下这些人之间是否存在类型* is_friends *的1:1关系。

编辑:如果使用节点(*)作为起点,Stefan的建议是完美的。但是当针对一个特定节点尝试此查询作为起始点(例如,开始n =节点(42))时,它不起作用。在这种情况下,解决方案会是什么样子?

更新:我仍然想知道这个szenario的解决方案:如何检查给定的起始节点是否与特定关系类型的另一个节点具有1对1的关系。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

MATCH子句中理解路径的概念至关重要。路径是节点,关系,节点,关系,......节点的交替集合。有一个约束条件是相同的关系永远不会在同一条路径中出现两次 - 否则就会有无限循环的危险。

也就是说,您需要确定您域中的is_friend是否被定向。如果它被指示你将一个朋友分为b和b分别是朋友。从描述中我假设is_friend是无向的,语句应如下所示:

START n=node(*) MATCH n-[r:is_friend]-()
WHERE r.since >= 2013
WITH n, count(r) as numberOfFriends
WHERE numberOfFriends=1
RETURN n

你不必关心另一端,但是你已经遍历了node(*)。请注意,当图表增长时,node(*)显然会变得更加昂贵。