【问题标题】:Cypher query doesn't return all the expected nodesCypher 查询不会返回所有预期的节点
【发布时间】:2015-12-02 13:28:51
【问题描述】:

我有这张图:

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

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    [更新]

    您的 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;
    

    【讨论】:

    • 感谢您的回复。你会澄清你的最后一句话吗?你的意思是关于第一个查询?
    • 是的。我已经用一个查询更新了我的答案,您可以执行该查询以查看我是否正确。
    • 我有点误读了你的问题,所以我再次更新了我的答案。
    • 谢谢。我不知道如果识别出一个节点,它将被排除在结果集中。
    【解决方案2】:

    两者都适合我。我已经尝试过 2.3.0 社区。 您介意发布您的 CREATE 命令吗?

    【讨论】:

      【解决方案3】:

      在每个MATCH 子句中,每个关系只会匹配一次。参考http://neo4j.com/docs/stable/cypherdoc-uniqueness.html。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-18
        • 1970-01-01
        相关资源
        最近更新 更多