我希望能够返回Item
节点的列表以及Item
中包含的嵌套Box
节点的列表。由于Item
节点与其嵌套的Item
节点之间的关系可能不同(例如WHEELS
,WINDOWS
,LIGHTS
),因此我想写一个跳过关系并返回任何嵌套Item
节点及其Item
子级的查询,因为Item
将至少具有一个Item
子级或没有子级(因此导致为空儿童名单)。
我希望仅通过传递Box
标识符(例如boxID
)就能做到这一点。
注意::我是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
的所有节点?
答案 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
开始在整个树中使用一致的方向
注意事项:无限制的可变长度关系可能要花费很长时间甚至会耗尽内存,这取决于您的数据库大小以及每个节点有多少关系。可以通过在长度上指定一个合理的上限来解决此问题。