我想返回用户的unMutualContacts(他们不是共同的朋友)。我想问题可能是:如何返回用户Y 为:CONNECTED 的节点,但不返回节点 用户X 是:CONNECTED 的目标。这是查询:
MATCH (o:User { id: y })-[con:CONNECTED]-(users:User)
MATCH (u:User { id: x })-[ucon:CONNECTED]-(viewerUsers:User)
WHERE NOT (u)-[:CONNECTED]-(users)
RETURN users
我想返回未连接 x 的已连接 y 的用户。我也尝试过:WHERE NOT (o)-[:PL_CONNECTED]-(viewerUsers)
代替NOT (u)-[:CONNECTED]-(users)
,但是没有任何运气。
答案 0 :(得分:1)
在这种情况下,使用列表将变得更加容易。我注意到您使用的是复数变量名users
和viewerUsers
,但它们不代表列表,它们代表每行的单个匹配项。我发现如果只为列表保留复数变量名称会有所帮助,这样可以避免混淆。
虽然我们可以使用MATCH和collect()来获取要排除的用户列表,但我们将采用一种快捷方式并使用模式理解从一行中的匹配项中获取列表。并且一旦有了要排除的用户列表,就可以在WHERE子句中为y
的已连接用户使用该列表,以确保我们过滤掉任何应排除的用户(因为他们已连接到x
)。
WITH [(:User { id: x })-[:CONNECTED]-(user:User) | user] as excluded
MATCH (:User { id: y })-[:CONNECTED]-(user:User)
WHERE NOT user IN excluded
RETURN user
或者,您可以同时获取两个列表并通过APOC程序进行列表减法:
WITH [(:User { id: x })-[:CONNECTED]-(user:User) | user] as excluded,
[(:User { id: y })-[:CONNECTED]-(user:User) | user] as users
RETURN apoc.coll.subtract(users, excluded) as users
请注意,该记录将仅返回一个列表,因此,如果您想使用一个用户返回到多个记录,则每个记录都需要将UNWIND用户返回给用户。