0

使用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 关系。

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

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

4

1 回答 1

3

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

也就是说,您需要确定is_friend您的域中是否是定向的。如果它是定向的,您将区分 a 与 b 的朋友和 b 与 a 的朋友。根据我假设的描述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(*)当您的图表增长时,它显然会变得更加昂贵。

于 2013-11-09T11:23:52.457 回答