【问题标题】:Returning cousins in Neo4j problem with WHERE在 Neo4j 中返回表兄弟的问题与 WHERE
【发布时间】:2021-12-05 15:20:51
【问题描述】:

我必须进行一个 Cypher 查询,该查询应该返回一个人的表亲(兄弟、姐妹、兄弟/姐妹的孩子)。它几乎可以正常工作,但问题是当我想过滤掉这个人的孩子 (27003) (precious) 写作 WHERE p2.personId<>27003 它也会删除这个人的母亲 (missing)

我在这里做错了什么?

我的密码查询:

MATCH (p: Person_kol)<-[]-(parent: Person_kol) WHERE p.idPerson=27003
WITH p,parent
MATCH (p3: Person_kol)<-[]-(p2: Person_kol)<-[]-(parent: Person_kol)
WHERE p2.idPerson<>27003
RETURN p,parent,p3,p2

我的第一场比赛只是返回给定 id 的人及其父母。

第二场比赛只搜索兄弟姐妹和他/她的孩子(我知道 p2 还包括 id=27003 的人和他/她的孩子,这就是为什么我想过滤掉他们,但我的“WHERE”也删除人的母亲(第二张图片)

图片:

  1. (无 WHERE 子句)

  1. (带 WHERE)

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您的第二个匹配子句要求parent 有一个孙子p3,其父级不是precious。由于missing 在第一张符合该标准的图片中没有孙子孙女,因此将她从结果中过滤掉。

    如果您想包括父母,无论他们是否有符合条件的孙子女,您可以发送optional match

    MATCH (p: Person_kol)<--(parent: Person_kol) WHERE p.idPerson=27003
    OPTIONAL MATCH (p3: Person_kol)<--(p2: Person_kol)<--(parent: Person_kol)
    WHERE p2.idPerson<>27003
    RETURN p,parent,p3,p2
    
    

    【讨论】:

    • 谢谢。我有点困惑,因为如果我不写 WHERE idPerson27003,即使我做了无效的 MATCH,它也会返回母亲,就像你提到的那样。因此,如果我进行无效匹配,这要求父母有任何孩子,但我没有写“WHERE”,它会返回母亲。
    • OPTIONAL MATCH 的文档有助于理解这一点。 neo4j.com/docs/cypher-manual/current/clauses/optional-match OPTIONAL MATCH 中的 WHERE idPerson27003 仍然返回母亲,因为她匹配第一个 MATCH 子句。但是,p3 和 p2 为空,因为涉及母亲的模式不符合可选匹配标准。如果没有 WHERE idPerson27003,您将获得如果包含 where 子句则不会出现的缺失-珍贵-美味和怀孕-珍贵-美味的模式。在结果中使用表格视图来查看。
    • 哦,我明白了,所以如果我做 WHERE,我的宝贝就像“父母”一样被“覆盖”,但如果我不做 WHERE,我的“宝贝”是 p2 正确的,并且这就是为什么妈妈没有回来?我还有一个问题——如果我不想返回“珍贵”(idPerson=27003) 的孩子,我该怎么办? (美味,线性)?
    • 缺失和怀孕是第一个模式中匹配为“父”的两个节点。在过滤第二个查询之前,将五个节点(包括previous)匹配为怀孕的p2,将珍贵的匹配为缺少的p2。如果您在 OPTIONAL 匹配子句中包含 WHERE p2.idPerson 27003,则会应用一个过滤器,该过滤器会删除任何 p2 非常宝贵的模式。如果您不以 p2 的形式返回珍贵,则不应以 p3 的形式返回珍贵的孩子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多