如何在neo4j中获得与两个节点而不是其他节点特别相关的节点?

如何在neo4j中获得与两个节点而不是其他节点特别相关的节点?,neo4j,cypher,Neo4j,Cypher,我有两种类型的标签用户和对话 用户与会话有传出关系 (u:User)-[:IS_PARTICIPANT]->(c:Conversation) 多个用户可以是对话的参与者。 现在我试图查询的是专门针对两个用户之间的对话 例如 MATCH (p1:User {name: 'Tom'})-[:IS_PARTICIPANT]->(c:Conversation)<-[:IS_PARTICIPANT]-(p2:User {name:"Jerry"}) return c MATCH(p1

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

(u:User)-[:IS_PARTICIPANT]->(c:Conversation)
多个用户可以是对话的参与者。 现在我试图查询的是专门针对两个用户之间的对话

例如

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

MATCH(p1:User{name:'Tom'})-[:IS_PARTICIPANT]->(c:Conversation)你有这样的想法吗

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

MATCH(p1:User{name:'Tom'})-[:IS_PARTICIPANT]->(c:Conversation)你有这样的想法吗

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

MATCH(p1:User{name:'Tom'})-[:IS_PARTICIPANT]->(c:Conversation)找到该节点,并找出有多少其他节点连接到该节点:

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
MATCH(p1:User{name:'Tom'})

-[:IS_PARTICIPANT]->(c:Conversation)找到该节点,并找出有多少其他节点连接到该节点:

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
MATCH(p1:User{name:'Tom'})

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

首先,给定任意大小的名称集合(您知道所有名称对应于:Users),这有助于确定所有给定节点何时与同一节点具有关系

其次,如果:IS_参与者关系始终只连接:User和:Conversation节点,那么我们可以使用
size(()-[:IS_参与者]->(c))
有效地获取传入的:IS_参与者关系到会话的数量,而不必支付实际扩展这些关系的成本

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

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

首先,给定任意大小的名称集合(您知道所有名称对应于:Users),这有助于确定所有给定节点何时与同一节点具有关系

其次,如果:IS_参与者关系始终只连接:User和:Conversation节点,那么我们可以使用
size(()-[:IS_参与者]->(c))
有效地获取传入的:IS_参与者关系到会话的数量,而不必支付实际扩展这些关系的成本

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

我发现我们也可以做WHERE SIZE((c)如果初始节点超过两个,那么解决这个问题会很有趣。这个
匹配(p:User)怎么样,其中p.name在[“Tom”,“Jerry”,“Tweety”]中匹配(c:Conversation)关闭,但此查询不能保证数组中的其余节点也连接到
c:Conversation
节点。不
匹配(c:Conversation)我发现我们也可以在大小((c)如果初始节点超过两个,则解决问题会很有意思。这个
匹配如何(p:User)其中,[“Tom”、“Jerry”、“Tweety”]中的p.name匹配(c:Conversation)关闭,但此查询不保证数组中的其余节点也连接到
c:Conversation
节点。不
匹配(c:Conversation)您好,感谢回复,但如果我们有更多与对话相关的用户,这可能没有帮助。您好,感谢回复,但如果我们有更多与对话相关的用户,这可能没有帮助。感谢回复,似乎我错过了match Crossion的知识库条目,非常有用。感谢回复,似乎我错过了知识库比赛交集的条目,非常有用的东西。