繁体   English   中英

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

[英]Neo4j Cypher - Returning nodes and their nested nodes of the same type

我希望能够返回一个Item节点列表,其中包含一个Box包含的嵌套Item节点列表。 因为Item节点与其嵌套的Item节点之间的关系可能不同(例如WHEELSWINDOWSLIGHTS ),我想编写一个查询来跳过这些关系并返回任何嵌套的Item节点及其Item子节点,因为Item将要么至少有一个ItemItem要么没有(因此导致子项列表为空)。

我希望能够通过传递一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM