database - Cypher 在 'join' 返回指数计数结果

标签 database graph neo4j cypher

我正在 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/

相关文章:

mysql - 需要对 MySQL 表进行排序并返回特定的子集

php - 使用 Auth::user() 填充表单

graph - 交互式替代点?

java - Spring data neo4j,按日期搜索

arrays - 将数组与 Cypher (Neo4j) 结合起来

MySQL:如果在日期之后达到特定值,则获取所有行

java - 如何使用 mysqlimport?

algorithm - 如何在线性时间内边权重为 0 或 1 的有向图中找到最短路径?

r - 如何将表格添加到图表中?

neo4j - 哪个图数据库