【问题标题】:Get connected graphs in neo4j by using cypher query使用密码查询在 neo4j 中获取连接图
【发布时间】:2014-03-19 06:11:32
【问题描述】:

我们如何修改 cypher 查询,以便它可以将所有连接的图(指直接或间接相互连接的节点和关系的集合)作为查询的结果。

我可以使用遍历框架来满足我的需求吗?

用例是: 我需要从 neo4j 获取所有连接图,并将它们的信息作为“集群”存储在其他数据库中。1 组连接图 = 1 个集群。 我需要分离连接的图,然后存储节点/关系的一些属性的聚合并将其存储在其他数据库中。

我正在使用 REST 与 neo4j db 交互。

【问题讨论】:

  • 请举例说明数据和预期结果,以及到目前为止您所做的尝试。你想返回一个特定节点的连接组件吗?还是图中所有连接的组件?由于 neo4j 具有类型关系,因此“连接”可能意味着以任何方式或某种特定方式相关,从而使连接组件子图的定义与特定兴趣相关;但你的问题太模糊了。

标签: neo4j cypher


【解决方案1】:

不过不会很快。

Java 中的专用算法会更快地收集数据。

Cypher 的想法(它的复杂性可能非常糟糕,而且还不能工作):

  1. 获取所有节点
  2. 每个节点
  3. 如果它连接到连接图(最短路径)的任何第一个节点,则跳过它, else 集合所有路径的所有端节点

.

MATCH (n) 
WITH COLLECT(n) as nodes
RETURN REDUCE(graphs = [], n in nodes | 
  case when 
    ANY (g in graphs WHERE shortestPath((n)-[*]-(head(g))) 
         then graphs 
         else graphs + [[p in (n)-[*0..]-() | nodes(p)[length(p)-1]]]
         end ))

【讨论】:

  • 嗨,迈克尔,你现在能看看这个问题吗?我已经编辑过了。
  • head(g) 引发语法错误。无效的输入“(”:需要标识符字符、节点标签、属性映射、空格或“)”
【解决方案2】:

@michael,我对您的查询进行了一些修改。现在它适用于我的数据。 我发布的变体每个连接的组件只保留一个元素。 如果对组件的实际成员不感兴趣,但仍希望能够检索每个组件的成员,这很方便。

@manish,我知道已经晚了,但也许您可以将组件代表存储在新数据库中,而不是所有成员。

MATCH (n) 
WITH COLLECT(n) as nodes
RETURN REDUCE(graphs = [], n in nodes | 
  case when 
    ANY (g in graphs WHERE shortestPath( (n)-[*]-(g) ) ) 
    then graphs 
    else graphs + [n]
    end )

【讨论】:

  • 请考虑编辑您的帖子,以添加更多关于您的代码的作用以及它为何能解决问题的说明。一个大部分只包含代码的答案(即使它正在工作)通常不会帮助 OP 理解他们的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多