如何根据Neo4j中最顶级的父节点检索节点

时间:2018-12-27 04:45:42

标签: graph neo4j cypher

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

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

查询-

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

提供属于父节点的整个网络->威廉-直到提到的最后一个节点-> checkoutby。

hierarchial network

但是,

我只希望出现两个相关的节点。

我尝试了查询-

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

但是在这里,威廉节点(即第一个父节点)的作用为零,并且无论父节点如何,我们都会获得输出。

为此,我什至尝试了此查询-

   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:类型不匹配:预期路径,但是Node(第1行,第36列,偏移量:35) “ MATCH(n)在哪里(节点(n)在哪里节点:william的节点)RETURN n UNION MATCH n =(p)-()-[:Parameter]->(b)WHERE 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 

请帮助。我只想从checkoutby / cabinet节点中检索最高的父节点-william

2 个答案:

答案 0 :(得分:0)

我没有声誉可言,因此请在这里询问:

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

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

我假设它是一个标签,看起来像是您共享的屏幕快照中的标签。

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

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

请注意:这类查询会占用过多的内存。

答案 1 :(得分:0)

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

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