2015-12-02 61 views
0

我有这个图:的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个节点是根的孩子。(很抱歉,这是不同的,但我发展,不想改变我的环境太多。)

这查询返回的所有4:

match(a)<-[]-(b:ROOT)-[]->(c) return c 

他们中的一个有 “DDDD” 的名字......

match(a {name"dddd"})<-[]-(b:ROOT)-[]->(c) return c 

此查询仅返回它们的。不包括“dddd”。我的天啊。

要回答cybersam的具体问题,这个查询:

MATCH (a {name:"dddd"})<--(rewt:CODE_ROOT) 
MATCH (rewt)-->(c) 
RETURN a = c; 

返回四行。该值是true, false, false, false

回答

2

[已更新]

你的2个查询是有区别的。 A MATCH子句将过滤掉所有重复的关系。

因此,你的第一个查询将过滤掉所有的比赛,其中左侧的关系是一样的右侧关系:

MATCH(a {name:"A"})<--(rewt)-->(c) 
RETURN c; 

你的第二个查询将允许2间的关系是一样的,由于关系是由2项独立MATCH条款发现:

MATCH (a {name:"A"})<--(rewt) 
MATCH (rewt)-->(c) 
RETURN c; 

如果我是正确的,那么下面的查询应返回N行(其中N是传出relationsh数量从rewt IPS)和仅一个值应该是true

MATCH (a {name:"A"})<--(rewt) 
MATCH (rewt)-->(c) 
RETURN a = c; 
+0

感谢您的答复。你能澄清你最后一句话吗?你的意思是关于第一个查询吗? –

+0

是的。我已经更新了我的答案,并且可以执行查询来查看我是否正确。 – cybersam

+0

OP已更新。你似乎是部分正确的。 –

0

两个工作对我蛮好。我试过2.3.0社区。 你介意发布你的CREATE命令吗?