【问题标题】:Searching not exists in Neo4j via Cypher通过 Cypher 在 Neo4j 中不存在搜索
【发布时间】:2016-06-30 17:13:34
【问题描述】:

我的图表中有一些人之间的关系。

我的数据(在下面生成脚本)

create (s:Person {name: "SUE"}) 
create(d:Person {name: "DAVID"}) 
create(j:Person {name: "JACK"}) 
create(m:Person {name: "MARY"}) 
create(js:Person {name: "JASON"}) 
create(b:Person {name: "BOB"}) 
create(a1:Adress {id:1}) 
create(a2:Adress {id:2}) 
create(a3:Adress {id:3}) 
create(a4:Adress {id:4}) 
create(a5:Adress {id:5}) 
merge (d)-[:MOTHER]->(s) 
merge(j)-[:MOTHER]->(s) 
merge(js)-[:MOTHER]->(m) 
merge(b)-[:MOTHER]->(m) 
merge(b)-[:CURRENT_ADRESS]->(a1) 
merge(js)-[:CURRENT_ADRESS]->(a2) 
merge(j)-[:CURRENT_ADRESS]->(a3) 
merge(s)-[:CURRENT_ADRESS]->(a4) 
merge(d)-[:CURRENT_ADRESS]->(a5)

;

我可以找到与孩子同住的母亲:

MATCH (p:Person)-[:CURRENT_ADRESS]->(a:Adress)<-[:CURRENT_ADRESS]-(t), (t)-[:MOTHER]->(p)
return p.name,t.name

p.name  t.name
MARY    JASON

但我想找没有与她的任何孩子一起生活的母亲。

如何在 Cyper 中做到这一点?

【问题讨论】:

  • 我编辑了我的帖子。我只想选择“SUE”。因为她没有和她的任何一个孩子住在一起。

标签: graph neo4j cypher not-exists


【解决方案1】:

实际上,在您的图表中,由于标识符不同,每个人都住在不同的地址。

让我们构建一个图形示例,介绍住在同一地址的姐姐:

CREATE 
(p:Person)-[:MOTHER]->(m:Person),
(p)-[:FATHER]->(f:Person),
(p)-[:SISTER]->(s:Person),
(p)-[:CURRENT_ADDRESS]->(a:Adress),
(m)-[:CURRENT_ADDRESS]->(b:Adress),
(f)-[:CURRENT_ADDRESS]->(c:Adress),
(s)-[:CURRENT_ADDRESS]->(a)

现在这很简单,将没有CURRENT_ADDRESS 深度关系的家庭成员与家庭成员匹配:

MATCH (p:Person)-[:MOTHER|:FATHER|:SISTER]->(familyMember)
WHERE NOT EXISTS((p)-[:CURRENT_ADDRESS*2]-(familyMember))
RETURN familyMember

【讨论】:

    【解决方案2】:

    试试这个

    MATCH (p:Person)-[:CURRENT_ADRESS]-(a:Adress), (p)-[:MOTHER|:FATHER]->(t)
    WITH p,a,t
    MATCH (p), (t) where not (t)-[:CURRENT_ADRESS]-(a)
    return p.NAME,t.NAME
    

    【讨论】:

      【解决方案3】:

      这应该可行:

      MATCH (p:Person)-[:CURRENT_ADRESS]-(a:Adress), (p)-[:MOTHER|:FATHER]->(t)-[:CURRENT_ADRESS]-(b:Adress)
      WHERE a <> b
      return p.NAME, t.NAME;
      

      顺便说一句,我还会在CURRENT_ADRESS 关系上放置适当的方向箭头。

      【讨论】:

        【解决方案4】:

        终于找到了。

        match path=(p:Person)-[:MOTHER]->(m:Person)-[:CURRENT_ADRESS]->(a:Adress)  
        where all(x in nodes(path) where not exists((p)-[:CURRENT_ADRESS]->(a)))
        return path
        

        【讨论】:

          猜你喜欢
          • 2014-11-27
          • 2013-09-14
          • 2023-04-03
          • 1970-01-01
          • 2017-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-12
          相关资源
          最近更新 更多