【发布时间】: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 中创建和运行查询。因此,为了方便使用,我的标签和属性名称对于特定节点是相同的,以使我们的代码更易于访问以供进一步使用。