【问题标题】:Extract subgraph in neo4j在 neo4j 中提取子图
【发布时间】:2013-04-12 16:18:52
【问题描述】:

我有一个存储在 Neo4j 中的大型网络。基于特定的根节点,我想在该节点周围提取一个子图并将其存储在其他地方。所以,我需要的是符合我的过滤条件的节点和边集。

Afaik 没有可用的开箱即用解决方案。有一个graph matching component available,但它只适用于完美匹配。 Neo4j API 本身只定义了graph traversal,我可以使用它来定义应该访问哪些节点/边:

Traverser exp = Traversal
    .description()
    .breadthFirst()
    .evaluator(Evaluators.toDepth(2))
    .traverse(root);

现在,我可以将所有节点/边添加到所有路径的集合中,但这非常低效。你会怎么做?谢谢!

EDIT将每个遍历的最后一个节点和最后一个关系添加到子图中是否有意义?

【问题讨论】:

    标签: neo4j subgraph


    【解决方案1】:

    至于图匹配,已经被 http://docs.neo4j.org/chunked/snapshot/cypher-query-lang.html 取代,它非常适合,并支持带有可选关系的模糊匹配。

    对于子图表示,我会使用 Cypher 输出来构造新的 Cypher 语句来重新创建图,就像 SQL 导出,类似

    start n=node:node_auto_index(name='Neo') 
    match n-[r:KNOWS*]-m 
    return "create ({name:'"+m.name+"'});"
    

    http://console.neo4j.org/r/pqf1rp 举例

    【讨论】:

      【解决方案2】:

      我通过构建基于所有遍历端点的诱导子图来解决它。

      从每个遍历的最后一个节点和边的集合构建子图不起作用,因为不包括不属于任何最短路径的边。

      sn-p 代码如下:

      Set<Node> nodes = new HashSet<Node>();
      Set<Relationship> edges = new HashSet<Relationship>();
      
      for (Node n : traverser.nodes())
      {
          nodes.add(n);
      }
      
      for (Node node : nodes)
      {
          for (Relationship rel : node.getRelationships())
          {
              if (nodes.contains(rel.getOtherNode(node)))
                  edges.add(rel);
          }
      }
      

      每条边被添加两次。传出节点一次,传入节点一次。使用 Set,我可以确保它只在集合中出现一次。

      可以只迭代传入/传出边,但不清楚如何处理循环(从节点到自身的边)。它们属于哪个类别?这个sn-p没有这个问题。

      【讨论】:

        【解决方案3】:

        dumping the database to cypher statements

        dump START n=node({self}) MATCH p=(n)-[r:KNOWS*]->(m) RETURN n,r,m;
        

        还有一个将第一个数据库 (db1) 的子图导入第二个 (db2) 的示例。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-18
          相关资源
          最近更新 更多