精华 Neo4j学习笔记(2)——手动索引和模式索引
发布于 19 天前 作者 pangguoming 90 次浏览 最后一次编辑是 8 天前 来自 分享

阅读目录

手动索引
模式索引
自动索引
何时使用索引
参考资料

和关系数据库一样,Neo4j同样可以创建索引来加快查找速度。 在关系数据库中创建索引需要索引字段和指向记录的指针,通过索引可以快速查找到表中的行。 在Neo4j中,其索引是通过属性来创建,便于快速查找节点或者关系。

手动索引

先来说一下怎样创建手动索引。 创建索引采用显示创建,就像添加节点一样添加索引项,一个索引项标识的是一个节点或者关系的属性值。 索引项中除了包含属性值,还存储了对正在索引的属性具有特定值的一个或多个节点的引用。 index.png

以上是一个使用email属性作为键值指向节点的索引。 先通过下面代码添加数据。

 try (Transaction tx = graphDb.beginTx()) {
     // 添加数据
     Label label = Label.label("Student");
     Node node1 = graphDb.createNode(label);
     node1.setProperty("name", "王翠花");
     node1.setProperty("email", "hua@qq.com");
     Node node2 = graphDb.createNode(label);
     node2.setProperty("name", "李小明");
     node2.setProperty("email", "ming@163.com");
     Node node3 = graphDb.createNode(label);
     node3.setProperty("name", "杨小红");
     node3.setProperty("email", "hong@gmail.com");
     node1.createRelationshipTo(node2, RelTypes.IS_FRIEND_OF);
     node1.createRelationshipTo(node3, RelTypes.IS_FRIEND_OF);
         // 提交事务
         tx.success();
 }

通过Neo4j查看,添加成功。 index.png 下面来创建索引。 Neo4j中使用IndexManager来管理索引,然后通过索引标识符来访问索引。

 IndexManager indexManager = graphDb.index();
 Index<Node> stuIndex = indexManager.forNodes("students");

上面个两行代码通过students向索引管理器去请求获得一个索引。 假如索引不存在则会自动创建。 因为是手动创建索引,所以还需要告诉数据库要添加的属性和对应的节点。

stuIndex.add(node1, "email", "hua@qq.com");
 stuIndex.add(node2, "email", "ming@163.com");
 stuIndex.add(node3, "email", "hong@gmail.com");

要添加一个节点到索引中,需要提供三个参数:需要索引的节点、索引键和索引的值。 索引创建好之后,来尝试通过索引查找节点。

 try (Transaction tx = graphDb.beginTx()) {
     String stuEmail = "hua@qq.com";
     // 获得索引
     IndexManager indexManager = graphDb.index();
     Index<Node> stuIndex = indexManager.forNodes("students");
     // 获得结果集
     IndexHits<Node> indexHits = stuIndex.get("email", stuEmail);
     // getSingle()会返回唯一结果,不唯一的话返回null
     Node stu = indexHits.getSingle();
     System.out.println(stu.getProperty("name", new String()));
 }
 //Output
 王翠花

如果一个索引对应着多个节点,例如如果将年龄作为索引键,那么会有多个学生节点有着相同的年龄。

这种情况迭代IndexHits即可。有两点需要注意:

  1. IndexHits是一次性迭代,不能重复使用。
    
  2. 使用完IndexHits后应该关闭。如果所有结果都已迭代,IndexHits会自动关闭,否则需要调用close()方法手动关闭。
    

在关系数据库中,如果更改有索引的数据,索引也会跟着自动更新。

但是对于Neo4j中采用手动方式创建的索引,Neo4j并不会随着数据的改变而自动更新。

既然没有这种机制,那么只能采用一种笨方法,就是“先删除后添加”等于“更新”。

删除索引使用Index的remove()方法。

 try (Transaction tx = graphDb.beginTx()) {
     String stuEmail = "hua@qq.com";
     // 获得索引
     IndexManager indexManager = graphDb.index();
     Index<Node> stuIndex = indexManager.forNodes("students");
     // 获得要删除索引对应的节点
     Node stuNode = stuIndex.get("email", stuEmail).getSingle();
     // 删除索引
     stuIndex.remove(stuNode, "email", stuNode.getProperty("email"));
     // 输出
     for (Node n : stuIndex.query("email", "*")) {
         System.out.println(n.getProperty("name"));
     }
 }
 // Output
 李小明
 杨小红

可以看到一个索引项已经删除,这时重新对节点的属性进行设置,然后调用索引的add()方法就能完成手动的更新。

如果想删除整个索引,使用delete()方法。

indexManager.forNodes(indexName).delete();

相对于对节点建索引,关系索引很少用到,因为需要查询的对象一般都是实体,也就是节点。

虽然可以手动创建和维护索引,但是感觉很麻烦,下面介绍由数据库自动创建和维护索引的方法。

模式索引

模式索引和关系数据库中的索引很相似。

每一个索引会对应一个标签和一组属性。例如对学生的姓名name进行索引,你只需要定义索引,数据库会负责维护它们。

无论是更新还是删除节点,索引都会自动更新或者删除。

创建模式索引的方法如下:

 IndexDefinition indexDefinition;
 try (Transaction tx = graphDb.beginTx()) {
     Schema schema = graphDb.schema();
     indexDefinition = schema.indexFor(Label.label("Student")).on("name").create();
     tx.success();
 }

首先要获取数据库的模式,然后提供Label和Property就完成了索引的创建,比手动创建简单了不少。

查询也同样简单,使用ResourceIterator存放结果集。

需要注意,如果ResourceIterator没有完全迭代,则需要使用close()方法手动关闭。

try (Transaction tx = graphDb.beginTx()) {
     ResourceIterator<Node> stus = graphDb.findNodes(Label.label("Student"), "name", "王翠花");
     while (stus.hasNext()) {
         System.out.println(stus.next().getProperties("name", "email"));
     }
     tx.success();
 }

输出结果:

 {name=王翠花, email=hua@qq.com}
删除索引的方法:
 try (Transaction tx = graphDb.beginTx()) {
     Label label = Label.label("Student");
     for (IndexDefinition indexDefinition : graphDb.schema().getIndexes(label)) {
         // There is only one index
         indexDefinition.drop();
     }
     tx.success();
 }

自动索引

《Neo4j 实战》这本书中的数据库版本是2.x,书中提到了自动索引,一种通过配置文件来创建索引的方法。 但是在目前的3.x版本中已经废弃,建议使用模式索引代替。

作者:没课割绿地 出处:http://www.cnblogs.com/justcooooode

回到顶部