在neo4j中获取所有连接节点的最有效方法

在neo4j中获取所有连接节点的最有效方法,neo4j,directed-graph,Neo4j,Directed Graph,的答案显示了如何获取通过已知关系类型的路径连接到特定节点的所有节点的列表 作为这个问题的后续,我试图确定像这样遍历图是否是通过任何路径将所有节点连接到特定节点的最有效方法 我的场景:我有一个组树(组可以有任意数量的子级)。这个I模型是关系的父对象。团体还可以通过一种称为角色扮演的特殊关系与任何其他团体建立联系。我的模型在人际关系中扮演着角色 我想问的最常见的问题是MATCH(n{name:“xxx”)-[*]->(o)RETURN o.name,但即使在少量节点上(4000个节点-返回答案需要5

的答案显示了如何获取通过已知关系类型的路径连接到特定节点的所有节点的列表

作为这个问题的后续,我试图确定像这样遍历图是否是通过任何路径将所有节点连接到特定节点的最有效方法

我的场景:我有一个组树(组可以有任意数量的子级)。这个I模型是关系的父对象。团体还可以通过一种称为角色扮演的特殊关系与任何其他团体建立联系。我的模型在人际关系中扮演着角色


我想问的最常见的问题是
MATCH(n{name:“xxx”)-[*]->(o)RETURN o.name
,但即使在少量节点上(4000个节点-返回答案需要5秒),这似乎也非常慢。请注意,该图可能包含循环(
n-IS_PARENT\u OF->o
n作为第一点,如果不使用标签和索引属性作为起始节点,则首先需要找到图中的所有节点,并打开PropertyContainer,查看节点是否具有值为“xxx”的属性名称

第二,如果您现在有一个近似的最大父关系深度,您可能希望限制搜索的深度


我建议您向节点添加您选择的标签,并为name属性编制索引。

使用标签,例如,将
:Group
作为起点,并为
:Group(name)
创建索引

然后Neo4j可以快速找到您的起点,而无需扫描整个图形

通过在查询前加上
PROFILE
,您可以很容易地看到时间花在了哪里

您真的想要从起点开始的所有任意长的路径吗?还是只想要所有连接的节点对

如果是后者,那么这个查询将更有效

MATCH (n:Group)-[:IS_PARENT_OF|:PLAYS_ROLE_IN]->(m:Group)
RETURN n,m

感谢您提供的关于名称索引的提示。我现在已经实现了。我有点困惑——在我看来,连通性是图中节点的一个基本属性。我知道neo4j支持数十亿个节点。相对稀疏的图中的4000个节点是如何使其窒息的:(@NeilGarb Neo4j可以从存储和遍历的角度支持图形中的大量节点。但是,如果你想得到一个关于你的问题的答案,你应该聪明地询问他们。执行完整的数据库遍历-总是坏事,应该避免。这就是标签和索引存在的原因。这允许Neo4j优化查询并执行它使用有限的数据集。我需要起始节点连接到的节点的唯一列表,通过任何路径连接(:is_PARENT_of and:PLAYS_ROLE_IN技术上可以合并为:CONTAINS或类似内容).自从提出这个问题以来,我发现使用遍历可以更快地给出答案。也许cypher不是正确的方法?你找到解决方法了吗?