[英]Neo4j Cypher - Returning nodes and their nested nodes of the same type
我希望能够返回一个Item
节点列表,其中包含一个Box
包含的嵌套Item
节点列表。 因为Item
节点与其嵌套的Item
节点之间的关系可能不同(例如WHEELS
、 WINDOWS
、 LIGHTS
),我想编写一个查询来跳过这些关系并返回任何嵌套的Item
节点及其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
所有节点?
使用可变长度关系模式非常容易:
MATCH (b:Box)-[:CONTAINS]->(:ItemInstance)-[*]-(i:Item)
WHERE b.boxID = $boxID
RETURN COLLECT(DISTINCT i) AS ItemChildren
需要DISTINCT
选项是因为变长关系结果可以多次返回相同的项目。
此查询还确认图表中显示的关系方向性。 CONTAINS
关系模式指定了适当的方向性,但可变长度关系 ( -[*]-
) 没有指定方向性,因为您的数据模型在从ItemInstance
开始的整个树中不使用一致的方向。
警告:无限可变长度关系可能需要很长时间甚至耗尽内存,这取决于您的数据库有多大以及每个节点有多少关系。 这可以通过指定一个合理的长度上限来解决。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.