我正在neo4j上学习cypher,我很难理解如何在cypher中执行有效的“join”等价物。
我使用的是标准的矩阵字符示例,我已经在名为“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把枪的原因是你的查询产生了笛卡尔积。这是因为您在同一个匹配语句中请求了项,但没有将它们连接起来。@切伊正确地指出,如果你想找到尼欧的枪,你会按照他在第一次询问中的建议去做。
如果你想得到一份船员名单和他们的枪,你可以这样做…
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)
如果你想找到所有知道近地天体多层深的船员,你可以这样写查询…
MATCH (crew:Crew)<-[:GIVEN_TO]-(g:Gun)
WITH crew, g
MATCH (neo:Crew {name: 'Neo'})-[:KNOWS*0..]->(crew)
RETURN crew.name, collect(g.name)
找到所有得到枪支的船员,然后确定他们中的哪一个有近地天体的路径。
关于database - Cypher在“join”上返回指数计数结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33549417/