繁体   English   中英

如何获取所有连接的节点,不包括特定关系

[英]How to get all connected nodes, excluding specific relationships

我正在寻找一种检索所有连接节点的高性能方法。 但是有一个转折。 我想排除通过某些关系类型连接的节点和子节点。

附图说明了我的情况。

有两个或多个节点群集。 我想检索单个群集的所有节点,具体取决于查询中的ID。 不包括通过“ LINK ...”关系连接的所有其他节点(来自不同群集)。

我知道如何通过以下方式检索所有连接的节点:

MATCH (n:MyNode {id : 123})-[*]-(connectedNodes) RETURN connectedNodes

WHERE子句进行过滤听起来像是一个坏主意,因为它仍将获取整个图。 APOC程序中是否有某些东西可以让我以这种方式做某事? 非常感谢您的帮助。

编辑1:我尝试了注释中给出的第一个建议,但是执行时间不够。 毕竟,我将尝试限制关联和节点类型。 我也尝试了使用递归函数在Python中自定义实现。 尚未完成。

编辑2:@InverseFalcon的建议很奏效。 首先过滤一次不考虑的所有可用关系类型,然后将apoc.path.subgraphNodes过程与相应的起始节点和有效的关系类型一起应用。 谢谢。 在此处输入图片说明

Tezra的回答有一些好处,您将需要返回DISTINCT connectedNodes,否则将得到重复的副本,但是在高度连接的图形上,这可能需要一段时间(甚至挂起),具体取决于节点的数量,因为Cypher感兴趣所有可能的匹配路径,而且这些路径可能很快就会失去控制。

对于APOC,我们可以处理这种情况,但是正如Tezra所说,我们没有办法将关系列入黑名单,即使有了,我们也没有办法根据关系类型的部分名称将其列入黑名单。

您需要使用的方法是先获取所有关系类型,然后删除以LINK开头的任何关系类型,然后将其余关系列表加入| 分隔的字符串。 然后,您可以将其传递给关系过滤器。

CALL db.relationshipTypes() YIELD relationshipType
WHERE NOT relationshipType STARTS WITH 'LINK'
WITH collect(relationshipType) as relTypes
WITH apoc.text.join(relTypes, '|') as relTypesString
MATCH (n:MyNode {id : 123})
CALL apoc.path.subgraphNodes(n, {relationshipFilter:relTypesString}) YIELD node
RETURN node as connectedNode

首先,我想强调的是Cypher并不限制信息的检索方式,它仅确定返回的信息。 因此,在排除此问题之前,请尝试使用WHERE(此外,请尝试升级到最新的Neo4j,以获得最聪明的密码计划者)。 这应该工作得很好,因为密码计划器可以在匹配结果时过滤结果。

MATCH (n:MyNode {id : 123})-[rs*]-(connectedNodes)
WHERE NONE(r in rs WHERE TYPE(r)="LINK")
RETURN DISTINCT connectedNodes

我可以想到的APOC程序要求您命名所使用的关系(您可以将标签列入黑名单,但似乎不适用于关系类型),因此它与-[rs:A|B|C|D*]-

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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