【问题标题】:Neo4j traversal for subgraph子图的 Neo4j 遍历
【发布时间】:2014-05-23 05:37:16
【问题描述】:

我想从 Neo4j 图数据库中提取子图。输入将是两个节点。我们需要从两个节点中找到所有单跳邻居并形成节点的联合(我们称之为闭包)。现在我们必须得到这个闭包中的所有关系(节点的联合,包括输入节点)。如何在 neo4j 中使用 java“有效地”解决这个问题。请提出建议。

【问题讨论】:

    标签: java neo4j traversal subgraph


    【解决方案1】:

    这样的?

    // find closure
    Set<Node> nodes = new HashSet<>();
    for (Node n : inputs) {
      for (Relationship rel : n.getRelationships()) {
          nodes.add(r.getOtherNode(n));
      }
    }
    nodes.addAll(inputs);
    
    // find rels withing closure
    Set<Relationship> rels = new HashSet<>();
    for (Node n : nodes) {
      for (Relationship rel : n.getRelationships()) {
          if (nodes.contains(r.getOtherNode(n))) rels.add(rel);
      }
    }
    
    return rels;
    

    【讨论】:

      【解决方案2】:

      在关闭 rels 时需要花费大量时间。我给了 2 个节点作为输入,其中闭包的大小为 2300。对于这个输入,获取数据大约需要 2 分钟。但我们需要几秒钟内的数据 Neo4j 中的节点总数:20000 个节点。 Neo4j 中的总 rels : 360000 边 以下是用于获取数据的代码。

      public void getSemanticContext() {

          List<Node> inputs = new ArrayList<>();
          List<Integer> qterms1 = new ArrayList<>();
          Set<Node> nodes = new HashSet<>();
          Set<Integer> closure = new HashSet<>();
          rdbms.createConnection();
      
          RandomWalk_RDBMS rwalk = new RandomWalk_RDBMS(rdbms, operation);
          Map<Integer, Double> sortedTerms=null;
      
      
          Transaction tx = graphDb.beginTx();
      
           try
           {
              ResourceIterator<Node> id1 =  graphDb.findNodesByLabelAndProperty( DynamicLabel.label("concept"), "name", "copy" ).iterator();
              ResourceIterator<Node> id2 =  graphDb.findNodesByLabelAndProperty( DynamicLabel.label( "concept"), "name", "main" ).iterator();
      
              if ( id1.hasNext() )
              {
                  firstNode = id1.next();
              }
              if ( id2.hasNext() )
              {
                  secondNode = id2.next();
              }
              System.out.println(firstNode.getProperty("id"));
              System.out.println(firstNode.getProperty("name"));
      
              // find closure
      
              qterms1.add(Integer.parseInt(firstNode.getProperty("id").toString()));
              qterms1.add(Integer.parseInt(secondNode.getProperty("id").toString()));
              inputs.add(firstNode);
              inputs.add(secondNode);
      
              closure.add(Integer.parseInt(firstNode.getProperty("id").toString()));
              closure.add(Integer.parseInt(secondNode.getProperty("id").toString()));
              for (Node n : inputs) 
              {
                for (Relationship rel : n.getRelationships()) {
                    nodes.add(rel.getOtherNode(n));
                    closure.add(Integer.parseInt(rel.getOtherNode(n).getProperty("id").toString()));
                }
              }
              nodes.addAll(inputs);
              System.out.println("closure generated");
              System.out.println(nodes);
              genScoreMap= new HashMap<>();
              // find rels withing closure
              Set<Relationship> rels = new HashSet<>();
              for (Node n : nodes) {
                  HashMap<Integer, Double> innerMap = new HashMap<Integer, Double>();
                for (Relationship rel : n.getRelationships()) {
                    if (nodes.contains(rel.getOtherNode(n))) 
                        {
                          rels.add(rel);
                          innerMap.put(Integer.parseInt(rel.getOtherNode(n).getProperty("id").toString()), Double.parseDouble(rel.getProperty("generatability_score").toString()));
                        }
                    genScoreMap.put(Integer.parseInt(n.getProperty("id").toString()), innerMap);
                }
              }
      
           }
           catch(Exception e)
           {
               e.printStackTrace();
           }
           tx.close();
          // System.out.println(genScoreMap);
           System.out.println("semantic context generated");
           sortedTerms=rwalk.randomWalk(qterms1,genScoreMap,closure);
          printResult(sortedTerms,rwalk);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多