Neo4j中的索引

smdnsysy  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(138)

我想知道当需要基于一些节点类型或字段的多个索引时,有什么更好的方法。例如,假设我想有一个学生的图表,并希望通过他们的学校和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();

更好的方法是什么?一个比另一个有优势吗?特别是在涉及大量节点时,性能或存储方面。
谢谢

hgc7kmma

hgc7kmma1#

你的方法完全有效。如果要查询某个学校的所有学生,可以用途:

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

相关问题