4

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

据我了解,我可以像这样为每所学校建立一个索引:

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

什么是更好的方法?一个比另一个有什么优势?当涉及很多节点时,尤其是性能方面或存储方面。

谢谢

4

1 回答 1

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时间属性,因此更容易为您的域建模。请参阅此演示图

于 2012-04-27T06:14:13.603 回答