Cypher查询不会返回所有预期的节点

时间:2015-12-02 13:28:51

标签: neo4j cypher

我有这张图:

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

3 个答案:

答案 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以供参考。

请参阅此相关问题:What does a comma in a Cypher query do?