使用密码查询在neo4j中获取连接图

时间:2014-03-19 06:11:32

标签: neo4j cypher

我们如何修改密码查询,以便它可以为查询提供所有连接的图形(表示直接或间接相互连接的节点和关系集)。

OR

我可以根据我的要求使用遍历框架吗?

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

我使用REST与neo4j db进行交互。

2 个答案:

答案 0 :(得分:2)

虽然不会很快。

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

Cypher的想法(其可能具有非常糟糕的复杂性并且尚未起作用):

  1. 获取所有节点
  2. 每个节点
  3. 如果它连接到已连接图形的任何第一个节点(shortestPath),则跳过它, 所有路径的所有终端节点的else集合
  4. 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 ))
    

答案 1 :(得分: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 )