Neo4j Cypher-返回节点及其嵌套节点的相同类型

时间:2019-06-14 09:55:15

标签: neo4j nested cypher

我希望能够返回Item节点的列表以及Item中包含的嵌套Box节点的列表。由于Item节点与其嵌套的Item节点之间的关系可能不同(例如WHEELSWINDOWSLIGHTS),因此我想写一个跳过关系并返回任何嵌套Item节点及其Item子级的查询,因为Item将至少具有一个Item子级或没有子级(因此导致为空儿童名单)。

我希望仅通过传递Box标识符(例如boxID)就能做到这一点。

enter image description here

注意::我是Neo4j和Cypher的新手,因此请(非常)详细地回答查询的工作原理。我希望能够了解其工作原理。谢谢!

例如

MATCH (iA: Item)-[r]->(iB: Item)-[r]->(b: Box) 
WHERE b.boxID = $boxID
RETURN COLLECT(iB.itemID AS ItemID, ib.name as ItemName, COLLECT(iA.itemID as ItemID, iA.name as ItemName, COLLECT(...) ) AS ItemChildren)

COLLECT(..)部分使我感到困惑。如何返回一个Item节点及其所有Item子节点以及所有这些子节点Item子节点,依此类推,直到空子节点为止?是否有更好的方法来MATCH的所有节点?

1 个答案:

答案 0 :(得分:1)

使用variable-length relationship模式非常简单:

MATCH (b:Box)-[:CONTAINS]->(:ItemInstance)-[*]-(i:Item)
WHERE b.boxID = $boxID
RETURN COLLECT(DISTINCT i) AS ItemChildren

需要使用DISTINCT选项,因为可变长度关系结果可以多次返回同一项目。

此查询还确认图中所示的关系方向性。 CONTAINS关系模式指定了适当的方向性,但是可变长度关系(-[*]-)没有指定方向性,因为您的数据模型并未从ItemInstance开始在整个树中使用一致的方向

注意事项:无限制的可变长度关系可能要花费很长时间甚至会耗尽内存,这取决于您的数据库大小以及每个节点有多少关系。可以通过在长度上指定一个合理的上限来解决此问题。