Neo4j 3.5发布,在索引方面大幅增强
<p class="md-end-block md-focus" contenteditable="true"><span class="md-expand">Neo4j 3.5版本已正式发布,这也是Neo4j宣布企业版闭源以来发布的第一个版本。</span></p>
这个版本在性能、资源使用率以及安全方面均有增强,我们可以先快速浏览一下这个版本:
-
全文索引
-
基于Index的快速排序
-
Go语言Driver
-
内置索引完善,性能有5X提升
-
将Transaction State移到Off heap区
接下来的内容,将重点探讨Neo4j的索引能力,Neo4j索引包含两大部分:
-
Neo4j的内置索引能力
-
基于Lucene的全文索引
Neo4j内置索引
基于单个Property构建的索引
创建单个Property索引的语法举例如下(本文范畴内的例子均来自Neo4j Document,见本文末尾的引用信息):
CREATE INDEX ON :Person(firstname)
如果一个Node拥有Label(“Person”),且同时拥有Property(“firstname”),那么这个Node将被添加到这个Index中。
基于多个Property构建的组合索引
创建两个Property组合索引的语法举例如下:
CREATE INDEX ON :Person(age, country)
如果一个Node拥有Label(“Person”),且同时拥有两个Property(“age”)与Property(“country”),那么这个Node将被添加到这个Index中。
例如:
NodeA: (a:Person {firstname: ‘Bill’, age: 34, country: ‘USA’})
NodeB: (b:Person {firstname: ‘Sue’, age: 39})
这个索引索引将包含NodeA但不包含NodeB,因NodeB缺乏Property(“country”)。
在查询中发挥的作用
假设系统中已经基于Person(firstname)创建了一个索引,对于如下查询:
MATCH (person:Person)
WHERE person.firstname = 'Andy'
RETURN person
基于这个索引,可以快速命中结果记录。
同样,如下两种查询也是可以基于这个索引进行的:
MATCH (person:Person)
WHERE person.firstname > 'B'
RETURN person
MATCH (person:Person)
WHERE person.firstname IN ['Andy', 'John']
RETURN person
对于组合索引,如果所关联的所有的Property都在查询条件中以Equal条件出现,则能起到最显著的加速作用。
全文索引
无论是Node还是Relationships的Property,都可能包含复杂的描述信息,基于这些信息的全文检索,则是一个关键需求。
Neo4j的全文索引能力是基于Apache Lucene实现:
-
既可以索引Nodes,也可以索引Relationships。
-
索引的创建,删除与更新均为事务性操作。
-
定制了Analyzer。
-
在Cypher中支持Lucene查询语法。
-
支持返回查询结果的Scoring信息。
-
索引可基于Node/Relationship的变化而自动更新。
-
可以基于Cypher Procedures进行访问。
-
可配置的数据一致性模型。
-
提供了数据与索引的一致性检查工具,并支持索引重建
下面我们给出一个创建索引,写数据以及查询的样例:
索引创建
CALL db.index.fulltext.createNodeIndex("titlesAndDescriptions",["Movie", "Book"],["title", "description"])
为Label名称为”Movie“以及”Book“的Nodes的Property(“title”)及Property(“description”)创建全文索引,索引名称为”titlesAndDescriptions“。
写数据
假设写入如下一条记录:
CREATE (m:Movie { title: "The Matrix" })
RETURN m.title
这条记录包含Label(“Movie”)并且包含了Property(“title”),因此,会被增加到索引”titlesAndDescriptions”中。
查询
CALL db.index.fulltext.queryNodes("titlesAndDescriptions", "matrix") YIELD node, score
RETURN node.title, node.description, score
这个查询中指定了返回score信息。查询结果如下所示:
因为这个Node的title信息中包含了关键词”matrix”,所以与查询条件相匹配。
总结
本文讲解了Neo4j的内置索引以及基于Lucene的全文索引能力,放眼整个数据库的角度,这些索引的实现并无亮点之处,但它们却很好的丰富了Neo4j所支持的查询类型。从整个NoSQL生态来看,索引能力支持力度参差不齐,但索引方面的增强,都是未来关键的发力方向。
参考信息
Graph Modeling Tips, Full-Text Search Preview, Building a Graph App
原文地址:http://www.nosqlnotes.com/technotes/graphdb/neo4j-index/</div>