繁体   English   中英

如何在Neo4j / Cypher查询中查找不同的节点

[英]How to find distinct nodes in a Neo4j/Cypher query

我正在尝试在neo4j / cypher中进行一些模式匹配,但遇到了这个问题:

我要搜索两种类型的图:

  1. 星图:具有一个中心节点和多个外向关系的图。

  2. n长度线图:长度为n的线图,其中没有节点是重复的(我的图中有一些双向边和周期)

所以主要的问题是当我做诸如此类的事情时:

  1. 匹配a-> b,a-> c,a-> d
  2. 匹配a-> b-> c-> d

Cypher不保证(当我尝试过)a,b,c和d都是不同的节点。 对于小图,可以很容易地用

不是(a = b)且不是(a = c)且...

但是我正在尝试使用大小为10+的图形,因此检查所有节点之间的相等性不是一个可行的选择。 Afaik,RETURN DISTINCT效果不佳,因为它不检查变量之间的相等性,仅检查不同行之间的相等性。 有什么简单的方法可以指定查询以区分名称不同的节点?

这是个老问题,但是请参阅APOC路径扩展器过程以解决这些用例,因为您可以更改扩展的遍历唯一性行为(使用遍历API的方式与这些过程所使用的方式相同)。

Cypher隐式使用RELATIONSHIP_PATH唯一性,这意味着对于返回的每个路径,关系必须是唯一的,不能在单个路径中多次使用它。

虽然这对于需要所有可能路径的查询很有用,但对于希望使用不同的节点或子图或防止在路径中重复节点的查询而言,这不是一个很好的选择。

对于n长度的路径,假设深度6仅具有任何类型的传出关系,我们可以将唯一性更改为NODE_PATH,其中节点在每个路径上必须是唯一的,路径中不得重复:

MATCH (n)
WHERE id(n) = 12345
CALL apoc.path.expandConfig(n, {maxLevel:6, uniqueness:'NODE_PATH'}) YIELD path
RETURN path

如果您希望所有可到达的节点达到一定深度(或通过省略maxLevel达到任何深度),则可以使用NODE_GLOBAL唯一性,或者仅使用apoc.path.subgraphNodes()

MATCH (n)
WHERE id(n) = 12345
CALL apoc.path.subgraphNodes(n, {maxLevel:6}) YIELD node
RETURN node

NODE_GLOBAL的唯一性意味着, 在所有路径上 ,一个节点必须是唯一的,它只会被访问一次,并且从给定的起始节点到该节点的路径只有一条。 这样可以大大减少需要评估的路径数量,但是由于这种行为,如果将所有关系扩展到已访问的节点,则不会遍历所有关系。

您不会通过此过程恢复关系(可以使用apoc.path.spanningTree() ,尽管如前所述,并非所有关系都将包括在内,因为我们将仅捕获到每个节点的单个路径,而不是所有可能的路径到节点)。 如果要使所有节点达到最大级别以及这些节点之间的所有可能关系,请使用apoc.path.subgraphAll()

MATCH (n)
WHERE id(n) = 12345
CALL apoc.path.subgraphAll(n, {maxLevel:6}) YIELD nodes, relationships
RETURN nodes, relationships

存在用于标签和关系过滤或基于预匹配节点列表的过滤(白名单,黑名单,端节点,终结者节点)的更丰富的选项。

我们还支持重复关系或节点标签的序列。

如果您需要在扩展过程中按节点或关系属性进行过滤,那么这不是一个好选择,因为该功能尚受支持。

暂无
暂无

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

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