【问题标题】:Neo4j query for modeling transitive clousure用于建模传递闭包的 Neo4j 查询
【发布时间】:2015-04-30 17:07:36
【问题描述】:

我正在探索 GraphDB 查询语言,并在 OriendDB here 中询问了有关传递闭包支持的问题?我想看看 Neo4J 是如何支持这个功能的:

简而言之,假设我将所有节点都标记为 PERSON。我有边缘被称为“父亲”将这些人联系在一起。对于给定的节点说 p1,我想知道以下查询在 Neo4j 中的样子:

找到p1的所有祖先?

我不熟悉 Neo4j 语法(但我认为可以定义我上面解释的这种结构),所以请原谅我跳过了架构定义。

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    您可以通过以下方式找到名为“Fred Flintstone”的PERSON 的所有祖先:

    MATCH (p1:PERSON {name: "Fred Flintstone"})-[:father*]->(f)
    RETURN f;
    

    您可以通过以下方式找到他的所有后代:

    MATCH (p1:PERSON {name: "Fred Flintstone"})<-[:father*]-(d)
    RETURN d;
    

    【讨论】:

    • 我可以在 Neo4J 中反向遍历,以类似方式查找给定人的后代吗?
    • 是的,你可以这样做。
    【解决方案2】:

    您可以更进一步,为祖先创建一个排序:

    匹配(n:Person{RN:1}) 匹配 p=n-[:father|mother*..99]->x return x.RN as RN,x.fullname as Name,length(p) as generation,reduce(srt2 ='', q IN nodes(p)| srt2 + replace(replace(q.sex,'M','A '),'F','B')) AS sortOrder 按 sortOrder 排序

    这是为家谱应用程序开发的,因此它既有母亲又有父亲。在这种情况下,父亲排在 (A) 母亲 (B) 之前。如果您只是在寻找行尾(union_id=1 表示没有父母):

    匹配(n:Person{RN:1}) 匹配 p=n-[:father|mother*..99]->x 其中 x.union_id=1 return x.RN as RN,x.fullname as Name,length(p) as generation,reduce(srt2 ='', q IN nodes(p)| srt2 + replace(replace(q.sex,'M','A '),'F','B')) AS sortOrder,x.union_id

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      • 2017-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多