Neo4j,Cypher:匹配;“集团”;包括特定的;“用户”;只有
我有Neo4j,Cypher:匹配;“集团”;包括特定的;“用户”;只有,neo4j,cypher,Neo4j,Cypher,我有(:User)节点,它们被分组为[:IN](:Group)节点 CREATE (u1:User {name: 'u1'}), (u2:User {name: 'u2'}), (u3:User {name: 'u3'}) CREATE (g1:Group {name: 'g1'}), (g2:Group {name: 'g2'}) CREATE u1-[:IN]->g1, u2-[:IN]->g1, u3-[:IN]->g1 CREATE u1-[:IN]->g2, u
(:User)
节点,它们被分组为[:IN]
(:Group)
节点
CREATE (u1:User {name: 'u1'}), (u2:User {name: 'u2'}), (u3:User {name: 'u3'})
CREATE (g1:Group {name: 'g1'}), (g2:Group {name: 'g2'})
CREATE u1-[:IN]->g1, u2-[:IN]->g1, u3-[:IN]->g1
CREATE u1-[:IN]->g2, u2-[:IN]->g2
RETURN *
给定“u1”和“u2”,我想找出它们单独属于哪个(:组)
,即“g2”。我的第一次尝试是不正确的:
MATCH (u:User)
WHERE u.name IN ['u1', 'u2']
WITH u
MATCH (u)-[:IN]->(g:Group)
RETURN g, collect(u)
它返回这些用户所属的两个(:Group)
,这是可以理解的
如何确定“u1”和“u2”单独属于“g2?”您可以尝试这样的标准:“u1”和“u2”都是组的成员,并且组中只有两个成员”。在cypher中有一种说法
MATCH (:User { name:'u1' })-[:IN]->(g)<-[:IN]-({ name:'u2' })
MATCH g<-[:IN]-(m)
WITH g, collect(m) AS members
WHERE length(members)= 2
RETURN *
MATCH(:User{name:'u1})-[:IN]>(g)您可以尝试类似“u1和u2都是组的成员,并且组中只有两个成员”这样的标准。在cypher中有一种说法
MATCH (:User { name:'u1' })-[:IN]->(g)<-[:IN]-({ name:'u2' })
MATCH g<-[:IN]-(m)
WITH g, collect(m) AS members
WHERE length(members)= 2
RETURN *
MATCH(:User{name:'u1})-[:IN]>(g)您可以尝试类似“u1和u2都是组的成员,并且组中只有两个成员”这样的标准。在cypher中有一种说法
MATCH (:User { name:'u1' })-[:IN]->(g)<-[:IN]-({ name:'u2' })
MATCH g<-[:IN]-(m)
WITH g, collect(m) AS members
WHERE length(members)= 2
RETURN *
MATCH(:User{name:'u1})-[:IN]>(g)您可以尝试类似“u1和u2都是组的成员,并且组中只有两个成员”这样的标准。在cypher中有一种说法
MATCH (:User { name:'u1' })-[:IN]->(g)<-[:IN]-({ name:'u2' })
MATCH g<-[:IN]-(m)
WITH g, collect(m) AS members
WHERE length(members)= 2
RETURN *
MATCH(:User{name:'u1})-[:IN]->(g)MATCH(g:Group)MATCH(g:Group)MATCH(g:Group)MATCH(g:Group)MATCH(g:Group)非常好,谢谢@luane!您认为它有效吗?该查询没有测试组中是否有两个用户。如果u1
也属于(并且单独在)一个组g3
,会发生什么情况?@GrantShield您可以在自己的neo4j sh
中分析查询以查看它们的效率,或者在运行查询,然后单击结果详细信息
。如果您有一个像:User(name)
这样的索引,那么将用户名包含在匹配项中会更有效,这是绝对正确的。它不考虑你提到的情况。我会将我的查询更改为匹配(u:User)-[:IN]->(g)和collect(u)作为groupUsers,g和groupUsers,g,length(groupUsers)作为groupCount,其中ALL(x在groupUsers中,x.name在['u1','u2']中)和groupCount=2返回g,但现在您的返回更多sense@jjaderberg,我可以为3个或更多用户使用Luane's。我不知道如何处理你的。太好了,谢谢@luane!您认为它有效吗?该查询没有测试组中是否有两个用户。如果u1
也属于(并且单独在)一个组g3
,会发生什么情况?@GrantShield您可以在自己的neo4j sh
中分析查询以查看它们的效率,或者在运行查询,然后单击结果详细信息
。如果您有一个像:User(name)
这样的索引,那么将用户名包含在匹配项中会更有效,这是绝对正确的。它不考虑你提到的情况。我会将我的查询更改为匹配(u:User)-[:IN]->(g)和collect(u)作为groupUsers,g和groupUsers,g,length(groupUsers)作为groupCount,其中ALL(x在groupUsers中,x.name在['u1','u2']中)和groupCount=2返回g,但现在您的返回更多sense@jjaderberg,我可以为3个或更多用户使用Luane's。我不知道如何处理你的。太好了,谢谢@luane!您认为它有效吗?该查询没有测试组中是否有两个用户。如果u1
也属于(并且单独在)一个组g3
,会发生什么情况?@GrantShield您可以在自己的neo4j sh
中分析查询以查看它们的效率,或者在运行查询,然后单击结果详细信息
。如果您有一个像:User(name)
这样的索引,那么将用户名包含在匹配项中会更有效,这是绝对正确的。它不考虑你提到的情况。我会将我的查询更改为匹配(u:User)-[:IN]->(g)和collect(u)作为groupUsers,g和groupUsers,g,length(groupUsers)作为groupCount,其中ALL(x在groupUsers中,x.name在['u1','u2']中)和groupCount=2返回g,但现在您的返回更多sense@jjaderberg,我可以为3个或更多用户使用Luane's。我不知道如何处理你的。太好了,谢谢@luane!您认为它有效吗?该查询没有测试组中是否有两个用户。如果u1
也属于(并且单独在)一个组g3
,会发生什么情况?@GrantShield您可以在自己的neo4j sh
中分析查询以查看它们的效率,或者在运行查询,然后单击结果详细信息
。如果您有一个像:User(name)
这样的索引,那么将用户名包含在匹配项中会更有效,这是绝对正确的。它不考虑你提到的情况。我会将我的查询更改为匹配(u:User)-[:IN]->(g)和collect(u)作为groupUsers,g和groupUsers,g,length(groupUsers)作为groupCount,其中ALL(x在groupUsers中,x.name在['u1','u2']中)和groupCount=2返回g,但现在您的返回更多sense@jjaderberg,我可以为3个或更多用户使用Luane's。我不知道如何处理你的。谢谢@jjaderberg,但不幸的是,它没有返回任何结果。@GrantShield My bad,不知道为什么我认为这会起作用。我已经更改了查询,现在它应该执行我的预期。@GrantShield您应该选择此答案,抱歉。我的很明显错过了一个案子。太棒了,谢谢你@jjaderberg!我还将查看查询分析器。我不确定如何查询3个或更多用户。我将尝试解决它,但现在选择另一个答案…谢谢@jjaderberg,但不幸的是,它没有返回任何结果。@GrantShield My bad,不知道为什么我认为这会奏效。我已经更改了查询,现在它应该执行我的预期。@GrantShield您应该选择此答案,抱歉。我的很明显错过了一个案子。太棒了,谢谢你@jjaderberg!我也会查看查询分析器。