在Neo4j中编制索引

Nit*_*mer 4 java indexing neo4j

我想知道当需要基于某个节点类型或字段的多个indecies时,什么是更好的方法.例如,假设我想要一个学生图表,并希望按照他们的学校和身份对其进行索引.

据我所知,每个学校都可以有这样的索引:

// 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();
Run Code Online (Sandbox Code Playgroud)

另一方面,我可以使用一个索引并执行以下操作:

// 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();
Run Code Online (Sandbox Code Playgroud)

什么是更好的方法?一个优于另一个的任何优势?特别是在性能方面或存储方面,当涉及很多节点时.

谢谢

Mic*_*ger 7

你的方法是完全有效的.如果您想查询学校的所有学生,您可以使用:

Iterable<Node> pupils = index.query(schoolName + ":*");
Run Code Online (Sandbox Code Playgroud)

您也可以将两个字段添加到索引中:

index.add(node, "schoolName", studentId);
index.add(node, "id", studentId);
Run Code Online (Sandbox Code Playgroud)

然后通过组合查询查询它们

Iterable<Node> pupils = index.query("schoolName:"+schoolName + " AND id:"+id);
Run Code Online (Sandbox Code Playgroud)

第一个是索引大小较小但第二个更强大.性能方面它不会产生如此大的差异(但你可以测试并报告).

你也可以使用一个结构图中的其中一所学校是一个节点和学生通过连接到它LEARNS_AT的关系也可以有一个startend时间属性,因此更容易你的域模型.请参阅此演示图