Neo4j グラフ データベースからサブグラフを抽出したいです。入力は 2 つのノードになります。両方のノードからすべてのワンホップネイバーを見つけて、ノードの結合を形成する必要があります(クロージャーと呼びましょう)。ここで、このクロージャ (入力ノードを含むノードの結合) 内のすべての関係を取得する必要があります。javaを使用してneo4jでこの問題に「効率的に」アプローチする方法。提案してください。
2 に答える
0
関係を閉鎖するのに時間がかかります。クロージャのサイズが 2300 の入力として 2 つのノードを指定しました。この入力の場合、データを取得するのに約 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);
}
于 2014-06-04T05:49:45.410 に答える