2017-04-25 122 views
-1

我是Neo4j的新手,试图找出获取节点的所有子节点的方法。这里是我的图模型: Graph Model找到特定节点的所有子节点,直到叶节点

正如你可以看到,根节点是可以具有在它之下SecurityGroup节点或用户下,它的节点的SecurityGroup节点。我需要查找根节点SecurityGroup节点的所有子节点(包括User和SecurityGroups),直到没有更多的嵌套为止。

+0

Hi @ ironMan。如果有任何答案已解决您的问题,请点击复选标记考虑[接受](https://meta.stackexchange.com/q/5234/179419)。这向更广泛的社区表明,您已经找到了解决方案,并为答复者和您自己提供了一些声誉。没有义务这样做。 –

回答

0

我需要找到所有的子节点(包括用户和SecurityGroups)的 根SecurityGroup节点,直到没有更多的嵌套

如果你想只从根节点的子节点您需要在您的查询提供一个ID类似财产或特定标签根节点指定此条件(如:根节点,:根,等等。)。

是不是一个好主意,使用由Neo4j的生成的ID属性,因为它can change

在根节点使用:Root标签,你可以这样做:

MATCH (:Root)<-[:BELONGS_TO*]-(c) 
RETURN c 

是指定内部关系名是个好主意“[”和“]”语义学的问题,并提高性能。

或者到:根标签和ID属性,你可以安装并使用GraphAware Neo4j UUID创建和管理通用唯一标识符在图形中的每个节点。

+1

感谢您的回复!我打算在图中添加更多的节点类型,因此图中将存在多种类型的关系。在这种情况下是否可以使用多个关系名称? – IronMan

+0

你好!是的,您可以匹配[通过多种关系类型](http://neo4j.com/docs/developer-manual/current/cypher/clauses/match/#_match_by_multiple_relationship_types),例如: MATCH(:Root)< - [ :belongs_to的|:ANOTHER_TYPE *] - (C)' –

1

下面是如何获取SecurityGroup节点的所有后代节点(根据您的图形模型))的一个示例,其中id属性值为123

MATCH (sg:SecurityGroup)<-[*]-(d) 
WHERE sg.id = 123 
RETURN d; 

您可能希望创建一个:SecurityGroup(id)指数(或唯一约束),以有效地发起查询(而不是扫描所有SecurityGroup节点)。

+0

谢谢!这工作!但是,当我运行此查询时,某些安全组仍显示为断开连接。在双击安全组节点时,它们会连接回图中的其他节点。没有新的节点被添加,只是新的边缘被加载。你能解释为什么吗? – IronMan

+0

您的数据模型图像显示所有关系指向“根”节点的方向,因此我的查询也需要相同的方向性。这也许可以解释为什么一些“连接”的节点没有被返回。如果您想忽视方向性,可以省略查询中的<<字符。另外,当双击一个节点时,neo4j浏览器将显示节点的所有“邻居”(达到可配置的限制)。 – cybersam

相关问题