Sandeep
Sandeep

Reputation: 53

Neo4j traversal for subgraph

I want to extract the subgraph from Neo4j graph database.The input will be two nodes. we need to find all the one-hop neighbors from both nodes and form the union of nodes(let's call it closure). Now we have to get all the relationships in this closure (union of nodes including input nodes). how to approach this problem in neo4j with java "efficiently". please suggest.

Upvotes: 0

Views: 185

Answers (2)

Sandeep
Sandeep

Reputation: 53

it's taking lot of time while getting the rels within closure. I gave 2 nodes as inputs where the closure is of size is 2300. For this input, it is taking around 2minutes to get the data. But we need the data in few seconds Total nodes in Neo4j : 20000 nodes. Total rels in Neo4j : 360000 edges The following is the code used to get the data.

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);
}

Upvotes: 0

Michael Hunger
Michael Hunger

Reputation: 41676

Something like this?

// 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;

Upvotes: 2

Related Questions