Philip Rathle谈Neo4j 2.3图数据库新特性和openCypher计划

jopen 8年前
 

近日,图NoSQL数据库 Neo4j 母公司Neo Technology发布了该数据库的2.3版本。同时,他们还宣布了openCypher计划,帮助创建一种标准的图查询语言。

为了获得更好的性能,2.3版本支持内存内页面缓存组件。另外,它还支持Docker工具,并增强了查询计划器。 Philip Rathle 是Neo Technology的产品副总裁,他在一篇 文章 中介绍了Neo4j最新版本的新特性。

openCypher旨在使Neo4j成为一个 更简单的图数据管理平台,以加速图处理和分析的应用。它主要包含如下四个部分:

  • 语言规范
  • 参考实现
  • 技术兼容工具包
  • Cypher参考文档

InfoQ就Neo4j最新版本的新特性和openCypher公告采访了Philip。

InfoQ:您能介绍下新的内存内页面缓存组件这个纯堆外缓存吗?它的工作原理是什么?为什么要构建一个原生缓存,而不是使用一种已有的缓存框架?

Rathle:将磁盘内容缓存移至堆外,可以让我们在管理整个数据库的内存时获得更多的控制。Neo4j以Java为基础构建。对于传统应用程序而言,它提供了出色的内存管理和性能,不过,当连续不断的查询操作导致大量数据循环经过数据库缓存时,它就无法满足要求了。

Neo4j的堆内缓存功能已经提供了极高的性能。这一直很有效……直到非常大的缓存与非常大的查询让Java的分代垃圾收集器备受压力,导致 JVM堆成为一个限制扩展的因素。按照设计,新的堆外缓存同堆内缓存一样快(实际上更快),远远超出缓存在受JVM堆限制时可能达到的图查询性能水平。同时,新缓存管理非常简单,调优选项更少,调优更灵活。

InfoQ:内存内页面缓存的并发访问是如何管理的?

Rathle:并发管理有多种机制。一是提供粒度够细但又互不影响的低级数据结构,同时粒度又要够大,可以提供一个有效的“缓存亲和度(cache affinity)”水平。二是快速锁定同智能锁定相结合,确保访问缓存的线程在大多数情况下都可以自由运行。再就是,我们还在Neo4j 2.3中新增了检查点,提供恰当的选项和默认值,用于不断地清除缓存。通过将负载在时间上分散开,在日志切换期间,查询仍然能够顺畅地操作。

InfoQ:增强后的Cypher查询计划器是如何工作的?有什么特别的应用场景比其他应用场景更有效吗?

Rathle:在Neo4j 2.3中,Cypher查询计划器在决定一个查询使用哪个执行计划之前会考察更多的计划。以前,为了避免内存过度使用,它会主动裁剪计划——这对于大查询非常合适。但计划器经常会陷入局部最优,导致次优查询计划。更新后的Cypher查询计划器采用了一种更好的算法,使它可以考察更多的计划,同时还能保持一个低水平的内存需求。

Neo4j 2.3还提供了可以用于求解查询的新操作符——例如,在适用的情况下,新增的TriadicSelection操作符可以让查询比以前快许多倍。

InfoQ:对于新版本的字符串强化图搜索功能,您能举几个例子吗?这个新功能是基于什么构建的?

Rathle:Neo4j 2.3向Cypher添加了新操作符——“STARTS WITH”、“ENDS WITH”和“CONTAINS”。这些操作符可以简化使用Cypher在图中搜索字符串属性的操作。此外,STARTS WITH操作符可以使用普通索引快速找到匹配的节点。

同STARTS WITH类似,在Neo4j 2.3中,Cypher计划器还能识别数值范围查询,并 且,会在基于数值属性在图中搜索节点时使用普通索引。所有这一切的关键是一个足够智能的优化器,它能够将图模式匹配与基于文本的索引结合起来,优化图-文混合搜索。

InfoQ:关于Docker支持,你们为开发人员提供了什么工具,让他们可以开始在Docker容器中使用Neo4j?

Rathle:我们已经构建了一个Neo4j Docker镜像。该镜像是官方Docker镜像库的一部分,在使用标准Docker工具运行Neo4j容器时可以使用。要了解更多关于Neo4j on Docker和可用工具的信息,可以查看通用文档,地址为 https://hub.docker.com/r/neo4j/neo4j/

InfoQ:Docker支持现在可以用于生产环境了吗?在将Neo4j与Docker一起使用时,有什么部署注意事项?

Rathle:是的。目前,Neo有一个官方Docker库,我们会为客户提供官方支持。至于最佳实践:内存可能是最重要的调优参数。底层硬件必须为运行在它上面的容器提供足够的内存;Neo4j镜像允许按需配置内存。而 Neo4j企业版 ——与社区版的差别主要是商业性——有许多社区版所没有的操作特性,包括集群。

本质上讲,Docker容器没有永久性,但Neo4j需要持久存储来存储数据。为此,底层硬件必须包含一块可以挂载到容器的磁盘。在默认情况下,Docker是彼此隔离的。在运行一个Neo4j集群时,必须仔细配置容器,确保它们彼此之间可以互相通信。

InfoQ:OpenCypher获得了来自Databricks和Oracle的支持。您能否详细介绍下,Spark GraphX图数据处理库如何从openCypher计划获益?

Rathle:该计划最终会实现Cypher在Spark上运行……或者至少成为Spark的图功能组件。现在,在Spark上做图查询,主要的选项是 Scala,这不错:Scala非常强大。(实际上,Cypher就是用Scala实现的。)但是,Cypher为许多习惯使用SQL的数据分析师提供了使用GraphX图分析功能的机会,我们为此感到兴奋,因为Spark是Neo4j很自然的补充。Spark主要是一个数据科学家获取洞识的工具集,Neo4j主要是一个在应用程序中实现实时图分析的平台。洞识和行动:很好的互补。

那是我们的愿景和动机。我们同Databricks建立了良好的友谊,Databricks联合创始人兼CEO Ion Stoica表示将为openCypher提供公共支持服务,对此我们非常高兴。用他的话说:“图处理正成为现代大数据技术栈中不可或缺的部分。 Neo4j Cypher查询语言将极大的加速图数据库的应用。我们希望将Cypher的图模式匹配能力带到Spark技术栈,使人们可以更方便地进行图查询。”

关于受访者

Philip Rathle 是Neo Technology的产品副总裁。他热衷于构建优秀的产品,帮助用户应对明天的挑战。在职业生涯的头十年,他为世界上其中一些最大的公司构建信息解决方案:首先是在埃森哲,然后是在Tanning Technology,后者是当时世界上顶尖的数据库咨询服务公司之一,他作为解决方案架构师,主要关注数据仓库和BI战略。

查看英文原文: Philip Rathle on Neo4j 2.3 Graph Database Features and openCypher Initiative