【问题标题】:How to retrieve a node based on its top-most parent node in Neo4j如何根据 Neo4j 中最顶层的父节点检索节点
【发布时间】:2020-01-06 07:13:48
【问题描述】:

我有一个节点关系的层次结构,例如:

组织->部门->系统->功能->端口->请求->响应->参数

查询 -

   MATCH q=(p)-[*]->(b:checkoutby) WHERE p.name ="william" RETURN q

给出属于父节点的整个网络 -> william 直到提到的最后一个节点 -> checkoutby。

但是,我只想显示两个相关节点。

我试过查询-

  MATCH (n:william) WHERE n is null RETURN n UNION MATCH  n=(p)- 
   [:Parameter]->(b)  WHERE         
    b.name ="checkoutBy"   RETURN n

但这里“william”节点的效果,即第一个父节点无效,我们得到的输出与父节点无关。

为此,我什至尝试过这个查询 -

   MATCH (n) WHERE none(node in nodes(n) WHERE node:william) RETURN n 
   UNION MATCH  n=(p)--()-[:Parameter]->(b)  WHERE b.name ="cabinet" 
   RETURN n

但我收到错误 -

Neo.ClientError.Statement.SyntaxError:类型不匹配:预期路径但为节点(第 1 行,第 36 列(偏移量:35)) “匹配(n)在哪里没有(节点中的节点(n)在哪里节点:威廉)返回n联合匹配n =(p)--()-[:参数]->(b)在哪里b.name =“cabinet”返回 n"

我什至尝试过交集查询,但无济于事。

  MATCH (n1:william), (n2),(q:cabinet)
  WHERE (n1)<-[:Department]-() AND (n2)<-[:Parameter]-(q)
  RETURN count(q), collect(q.name)

警告错误-

此查询在断开连接的模式之间构建笛卡尔积。

如果查询的一部分包含多个不连贯的模式,这将在所有这些部分之间构建一个笛卡尔积。这可能会产生大量数据并减慢查询处理速度。虽然偶尔是有意的,但通常可以通过在不同部分之间添加关系或使用 OPTIONAL MATCH(标识符为:(n2))来重新制定避免使用此叉积的查询

   EXPLAIN MATCH (n1:william), (n2),(ego:cabinet)
           ^

即使这个查询也不起作用 -

  MATCH (n:william)  RETURN n UNION MATCH  n=(p)-[:Parameter]->(b)  
  WHERE b.name ="checkoutBy" 
   call apoc.path.expandConfig(n, {labelFilter:'-william'}) yield path
    return path 

我只想从最顶层的父节点 (william) 中检索 checkoutby / cabinet 节点。

【问题讨论】:

  • 这里有一个非常奇怪的数据模型。请理解,标签通常是类型,而不是类型的实例,因此具有 name:'William' 属性的 :Person 节点是有意义的,但 :william 节点并不能真正起作用。此外,您的关系类型似乎更像您的节点标签应该是什么。这是一个非常令人困惑的数据模型,很难理解您正在建模的内容以及您想要返回的数据。
  • 我们编写了一个代码,在 neo4j 中创建和运行查询。因此,为了方便使用,我的标签和属性名称对于特定节点是相同的,以使我们的代码更易于访问以供进一步使用。

标签: graph neo4j cypher


【解决方案1】:

我没有声誉可以发表评论,所以在这里问:

您的问题不清楚 William 是 Name 属性还是 Label?

您在第一个查询中将其用作名称,并在所有其他查询中用作标签。

我假设它是一个标签,看起来它是您分享的屏幕截图中的一个标签。

如果您想检查 checkoutby/cabinet 节点是否与 William 节点相关并且仅在相关时返回,您可以使用以下查询:

MATCH (w:william)-[*]-(c:checkoutby) return w,c

请注意:这些类型的查询消耗过多的内存。

【讨论】:

    【解决方案2】:

    如果我理解了您的问题,则 (b:checkoutby) 节点没有任何传入关系,因此您可以编写:

    MATCH (p)-[*]->(b:checkoutby) WHERE p.name ="william"  AND NOT EXISTS ( (b)-[]->()) RETURN p, b
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      • 2021-09-23
      相关资源
      最近更新 更多