Reputation: 53
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
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
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