2012-04-26 5 views
4

いくつかのノードタイプまたはフィールドに基づいて複数のindeciesを持つ必要がある場合は、より良いアプローチが何であるか疑問に思っています。 たとえば、生徒のグラフを作成し、学校とIDでインデックスを作成したいとします。Neo4jでのインデックス作成

// add student 
Index<Node> index = this.graphDb.index().forNodes(schoolName); 
Node node = this.graphDb.createNode(); 
node.setProperty("id", studentId); 
index.add(node, "id", studentId); 

// get student 
Index<Node> index = this.graphDb.index().forNodes(schoolName); 
Node node = index.get("id", studentId).getSingle(); 

私は一方の使用1つのインデックスにすることができますし、ような何か:何が良いアプローチです

// add student 
Index<Node> index = this.graphDb.index().forNodes("schools"); 
Node node = this.graphDb.createNode(); 
node.setProperty("id", studentId); 
index.add(node, schoolName + ":id", studentId); 

// get student 
Index<Node> index = this.graphDb.index().forNodes("schools"); 
Node node = index.get(schoolName + ":id", studentId).getSingle(); 

を私はこのような学校ごとのインデックスを持つことができます理解したよう

? もう一方の利点は何ですか? 特に多くのノードが関与している場合は、パフォーマンスが賢明またはストレージが賢明です。

ありがとうございました

答えて

7

あなたのアプローチは完全に有効です。あなたは学校の全生徒を照会したい場合 あなたは使用することができます。

Iterable<Node> pupils = index.query(schoolName + ":*"); 

あなたはまた、単にインデックスに両方のフィールドを追加することができます:複合クエリーによって

index.add(node, "schoolName", studentId); 
index.add(node, "id", studentId); 

をし、それらを照会

Iterable<Node> pupils = index.query("schoolName:"+schoolName + " AND id:"+id); 

最初のものはインデックスサイズは小さくなりますが、もう1つはより強力です。 パフォーマンスはそれほど大きな違いはありません(ただし、テストして報告できます)。

ます。また、学校はノードであり、生徒もstartend一時的な性質を持つことができますLEARNS_AT関係によってそれに接続されたグラフ構造を使用することができ、あなたのドメインをモデル化することが容易です。これを参照してくださいdemo graph

+0

ああ、コンソール!ありがたいことに、それが存在することを知らなかった。私はこれで非常に新しいです、私はそれをチェックします。 –

関連する問題