我正在 Neo4j 上学习 Cypher,但我很难理解如何在 Cypher 中执行有效的“连接”等效操作。
我正在使用标准 Matrix 字符示例,并且我已将一些节点添加到名为“Gun”的混合中,其关系为“:GIVEN_TO”。您可以在此处查看带有我的查询结果的控制台:
http://console.neo4j.org/r/rog2hv
我使用的查询是:
MATCH (Neo:Crew { name: 'Neo' })-[:KNOWS*..]->(other:Crew),(other)<-[:GIVEN_TO]-(g:Gun),(Neo)<-[:GIVEN_TO]-(g2:Gun)
RETURN count(g2);
我已经给了 Neo 4 枪,但是当我执行上述操作时,我得到的计数是“12”。这似乎是因为有 3 个“其他”和 3*4 = 12。所以我得到了一些指数结果。
我的查询应该是什么样子才能从示例中获得正确的计数(“4”)?
编辑:
我没有按照@ceej 的建议直接通过 Guns 查询的原因是因为在我的实际用例中我必须如上所述进行遍历。添加DISTINCT
对我的结果没有任何影响。
最佳答案
您得到 12 把枪而不是 4 把枪的原因是因为您的查询生成笛卡尔积。这是因为您在同一匹配语句中请求了项目,但没有加入它们。 @ceej 正确地指出,如果你想找到 Neo 的枪,你会按照他在第一个问题中的建议去做。
如果您想获得船员及其枪支的列表,那么您可以这样做......
MATCH (crew:Crew)<-[:GIVEN_TO]-(g:Gun)
RETURN crew.name, collect(g.name)
它会找到所有带枪的船员,并返回他们的姓名和给他们的枪。
如果您想反转它并获得枪支列表以及他们提供给您的相应船员,您可以执行以下操作...
MATCH (crew:Crew)<-[:GIVEN_TO]-(g:Gun)
RETURN g.name, collect(crew.name)
如果你想找到所有了解 Neo 多层次并获得枪支的船员,你可以像这样编写查询...
MATCH (crew:Crew)<-[:GIVEN_TO]-(g:Gun)
WITH crew, g
MATCH (neo:Crew {name: 'Neo'})-[:KNOWS*0..]->(crew)
RETURN crew.name, collect(g.name)
这会找到所有获得枪支的船员,然后确定他们中的哪些人有通往 Neo 的 :KNOWS
路径。
关于database - Cypher 在 'join' 返回指数计数结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33549417/