我有这张图:
A<-B->C
B是一棵小树的根。 A和B之间只有一个关系,B和C之间只有一个关系。
运行以下命令时,将返回一个节点。为什么此Cypher查询不返回A和C节点?
MATCH(a {name:"A"})<-[]-(rewt)-[]->(c) RETURN c
似乎该查询的前半部分将找到根,而后半部分将找到两个子节点。
直到几分钟前,我认为它在逻辑上与下面的查询相同。有什么区别?
MATCH (a {name:"A"})<-[]-(rewt)
MATCH (rewt)-[]->(c)
RETURN c
编辑cybersam
我已经抽象了我的数据库,所以我们可以讨论我的具体问题。现在,我们仍然有一棵小树,但有4个节点是根的子节点。(抱歉这是不同的,但我正在开发并且不想过多地改变我的环境。)< / p>
此查询返回全部4:
match(a)<-[]-(b:ROOT)-[]->(c) return c
其中一个名称为&#34; dddd&#34; ...
match(a {name"dddd"})<-[]-(b:ROOT)-[]->(c) return c
此查询仅返回三个。 &#34; DDDD&#34;不包括在内。 OMG。
要回答cybersam的具体问题,请查询:
MATCH (a {name:"dddd"})<--(rewt:CODE_ROOT)
MATCH (rewt)-->(c)
RETURN a = c;
返回四行。值为true, false, false, false
答案 0 :(得分:2)
[增订]
您的2个查询之间存在差异。 MATCH
子句将过滤掉所有重复的关系。
因此,您的第一个查询会过滤掉左侧关系与右侧关系相同的所有匹配项:
MATCH(a {name:"A"})<--(rewt)-->(c)
RETURN c;
您的第二个查询将允许2个关系相同,因为关系是由2个单独的MATCH
子句找到的:
MATCH (a {name:"A"})<--(rewt)
MATCH (rewt)-->(c)
RETURN c;
如果我是对的,那么以下查询应该返回N
行(其中N
是来自rewt
的传出关系的数量)并且只有一个值应为true
}:
MATCH (a {name:"A"})<--(rewt)
MATCH (rewt)-->(c)
RETURN a = c;
答案 1 :(得分:0)
两者对我来说都很好。我试过2.3.0社区。 你介意发布你的CREATE命令吗?
答案 2 :(得分:0)
在每个MATCH
子句中,每个关系只匹配一次。请参阅http://neo4j.com/docs/stable/cypherdoc-uniqueness.html以供参考。