2012-04-26 2 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(); 

나는 다른 손을 사용 하나 개 인덱스 수와 같은 것을 수행합니다 : 무엇이 더 나은 방법입니다

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

첫 번째 색인은 더 작지만 두 번째 색인은 더 강력합니다. 성능이 현저히 좋지는 않습니다 (하지만 테스트하고 다시보고 할 수는 있습니다).

또한 학교는 노드와 학생이 또한 startend 시간적 속성을 가질 수 LEARNS_AT 관계에 의해 첨부 된 그래프에서 구조를 사용할 수 있으므로 도메인을 모델링하는 것이 더 쉽습니다. 이봐 demo graph

+0

와우, 콘솔! 그것 주셔서 감사합니다, 그것의 존재를 인식하지 못했습니다. 나는 이것에 아주 새롭다, 나는 그것을 체크 아웃 할 것이다. –