2012-04-26 171 views
4

我想知道當需要根據某些節點類型或字段設置多個indecies時,什麼是更好的方法。 例如,假設我想要一張學生圖,並希望通過他們的學校和身份證編制索引。在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(); 

我能,另一方面採用一個指標,這樣做:

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

第一個索引尺寸較小,但第二個更強大。 表現明智,它不會造成如此大的差異(但你可以測試它並報告回來)。

你也可以使用一個結構,在一所學校的一個節點,學生由LEARNS_AT關係也可以有一個startend時間屬性附加給它的圖形,所以很容易到你的域模型。看到這個demo graph

+0

哦,哇,一個控制檯!謝謝你,沒有意識到它的存在。我對此很新,我會檢查一下。 – 2012-04-27 08:57:03