如何在neo4j中获取与两个节点而非其他节点特定相关的节点?

时间:2017-12-20 10:42:24

标签: neo4j cypher

我有两种类型的标签User和Conversation 用户与会话具有传出关系

(u:User)-[:IS_PARTICIPANT]->(c:Conversation)

多个用户可以成为对话的参与者。 现在我想要查询的是仅针对两个用户之间的对话。

代表

MATCH (p1:User {name: 'Tom'})-[:IS_PARTICIPANT]->(c:Conversation)<-[:IS_PARTICIPANT]-(p2:User {name:"Jerry"})
return c

以上查询确实返回了两个用户Tom和Jerry之间的对话,但即使在该特定对话中还有其他用户Tweety,它也将返回此对话。在密码中是否有一种方法我们可以专门进行只有特定用户参与而不是其他用户的对话。

3 个答案:

答案 0 :(得分:3)

找到节点,找出有多少其他节点连接到它:

MATCH   (p1:User {name: 'Tom'})
       -[:IS_PARTICIPANT]->(c:Conversation)<-[:IS_PARTICIPANT]
       -(p2:User {name:"Jerry"})
MATCH (c)<-[:IS_PARTICIPANT]-(u:User)
WITH c, 
     COUNT(u) AS countUser WHERE countUser = 2
return c

如果节点多于两个:

WITH ["Tom", "Jerry", "Tweety"] as names
MATCH (p:User)-[:IS_PARTICIPANT]->(c:Conversation) 
      WHERE p.name IN names
WITH distinct c, 
     names
MATCH (c)<-[:IS_PARTICIPANT]-(u:User) 
      WHERE u.name in names
WITH distinct c, 
     names, 
     count(distinct u) as countUser 
     WHERE countUser = size(names)
RETURN c

答案 1 :(得分:2)

我们可以在这里使用一些技巧。

首先,给定一个任意大小的名称集合(您知道所有名称对应于:Users),this knowledge base entry可以帮助确定所有给定节点何时与同一节点有关系。

其次,如果:IS_PARTICIPANT关系始终只连接:User和:Conversation节点,我们可以使用size(()-[:IS_PARTICIPANT]->(c))有效地获得传入的数量:IS_PARTICIPANT与对话的关系,而无需支付实际扩展的成本那些关系。

WITH ["Tom", "Jerry", "Tweety"] as names // should be parameterized instead
WITH names, size(names) as requiredCount
MATCH (u:User)
WHERE u.name in names
WITH u, requiredCount
MATCH (u)-[:IS_PARTICIPANT]->(c:Conversation)
WITH requiredCount, c, count(u) as matches
WHERE requiredCount = matches and size(()-[:IS_PARTICIPANT]->(c)) = requiredCount
RETURN c

答案 2 :(得分:0)

你有这样的想法吗?

MATCH (p1:User {name: 'Tom'})-[:IS_PARTICIPANT]->(c:Conversation)<-[:IS_PARTICIPANT]-(p2:User {name: 'Jerry'})
WHERE NOT (c:Conversation)<-[:IS_PARTICIPANT]-(:User {name: 'The Dog'})
RETURN c

此处,用户The Dog不是对话的参与者。