我有一个节点关系层次结构,例如-
组织->部门->系统->功能->端口->请求->响应->参数
查询-
MATCH q=(p)-[*]->(b:checkoutby) WHERE p.name ="william" RETURN q
提供属于父节点的整个网络->威廉-直到提到的最后一个节点-> checkoutby。
但是,
我只希望出现两个相关的节点。
我尝试了查询-
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
答案 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