图数据库能做些什么?查询语言说了算
编译丨科技行者
新一代图数据库已经在市场上站稳脚跟,与之相伴的一代查询语言也应运而生。包括Gremlin、Cypher以及GQL等在内的各类图数据库查询语言,专门帮助用户解包图内信息。
从本质上讲,一切数据库都需要一种与客户交流的方式,而查询语言的职责正是定义数据库能够做些什么。良好的图数据库查询语言应该以尽可能简单的方式帮助开发人员根据数据库内定义的网络提出复杂问题,进而释放出图数据库的强大力量。最初,这些语言各自面向不同的新数据库以专有方案的形式存在,但最近一段时间各查询语言间的开放标准正在加速建立。
在关系数据库领域,SQL(结构化查询语言)多年以来一直是行业的主导标准。它定义了一种在表内搜索符合特定条件的数据行的核心方法。如果数据跨越多个表,SQL还提供一种表对齐方法,以便将所有信息连接至统一的集合之内。SQL特别擅长查找包含与某些规定相匹配的特定字段的特定条目集合,但也就仅此而已了。
经典关系数据库也能存储图,因此在图数据库出现之前,这也是开发人员所能仰仗的唯一选择。SQL能够回答一部分基础问题,但传统查询语言却往往处理不了那些最有用、最具吸引力的问题。事实上,关系数据库在表达极端复杂关系方面远远不及图数据库,而关系数据库查询的唯一解决方案就是返回大块数据以供客户端软件运行进一步分析。
所以大家应该理解了,图查询语言的诞生是为了回答更为复杂的问题,例如:
在一棵家谱树中,某人有多少个远房表亲?
在记录朋友或关注者信息的社交媒体图片中,两个用户之间的分离程度是多少?
在企业的供应链中,工厂与客户之间的最长跳数是多少?
在一系列银行交易中,哪些人与欺诈交易间的关系高于平均水平?
在计算机网络中,哪些具有更高带宽的新连接可用于解决性能瓶颈?
图数据库需要多种不同模型,其中某些查询需要跟踪多条链接或跳点。最初,每种图数据库都使用自己的专有查询语言。好在最近几年,图数据库厂商开始添加新的实现并致力于推动开源标准以实现交叉支持。目前最常见的图查询语言包括:
Gremlin——最初为Apache Tinkerpop项目开发的图搜索语言,可实现过程性或声明性查询。
Cypher——最初由Neo4J创建,之后以OpenCypher的形式得到普及,这种声明性语言可用于搜索匹配特定属性的顶点和边。
GQL——一项标准倡议,致力于将Cyher、GSQL以及PSQL统一起来。
SPARQL——一种为了查询RDF格式知识图谱而建立的标准。
PGQL——甲骨文的原创语言,用于从符合规范的顶点当中搜索并收集信息。
GSQL——TigerGraph的原创过程语言。
AQL——ArangoDB的原创过程语言。
GraphQL——顾名思义,它肯定支持图查询;但GraphQL实际是一种更为通用的查询语言,能够高效搜索大部分文档与关系数据库。它虽然也能发掘出一部分图数据库用途,但总体来讲只是在支持与关系数据库相同的常规查询。
不同查询语言之间存在着一系列本质差异。有些查询语言属于“声明性”,另一些则属于“过程性”。也就是说,有些是让开发者通过编写定义子集的简单规则来声明自己“想干什么”,再由数据库应用这些规则、使用可用的索引构建搜索计划、再找到一切可能的匹配项。
例如,用户可能需要查找相距10英里之内的所有超过10000美元的银行交易行为,或者是搜索互有联系而且在过去两周之内没发过新帖的社交媒体用户。这些规则可以包括对标准查询语言(“WHERE AGE<20”)中找到的值的所有过滤,再加上关于网络连接的其他复杂规则(“IS RELATED TO”)。一般来说,图查询语言在搜索关系图方面表现得最为突出。
而过程性查询语言则更接近于传统计算机语言,允许开发人员控制数据库搜索条目的具体方式,一般是编写循环或者其他控制结构。总的来讲,声明式语言更易于理解和使用,因为它隐藏掉了大部分搜索工作;但过程性语言则更为强大。一部分数据库能够同时支持这两种查询方式。
另一个主要区别,则来自数据库结构本身。有些数据库支持RDF,有些则支持所谓属性图。RDF模型属于W3C标准,最初用于对语义信息进行编码。属性图模型则往往更通用也更灵活。同样的,一部分数据库能够同时支持这两种模型。
传统用户如何快速适应图查询语言?
Oracle向常规SQL查询语言中添加了图搜索功能,由此为主数据库实现了图功能。这种名为PGQL(属性图查询语言)的扩展提供了一种简洁的方法,可供开发者快速搜索图片并创建关于匹配条件的顶点报告。其图分析框架以数十种常见算法为起点,通过扩展逐步为基础数据构建起复杂的摘要。另外,它还同时支持属性图与RDF图。
微软在2017年向其SQL Server添加了图功能,并使用匹配属性模式的MATCH子句扩展了其SQL版本。搜索操作可以通过命令式查询的存储过程进行扩展。Azure云中的Microsoft Cosmos数据库支持Apache TinkerPop API,因此能够支持所有Gremlin式查询。
亚马逊的主要图数据库为Amazon Neptune,同样支持属性图与RDF图。属性图可以使用Gremlin类查询进行搜索,而RDF图则适合由SPARQL进行搜索。
IBM公司一直与多家图数据库厂商合作,例如Neo4J,并在自家云中提供相关的产品即服务。此服务名为IBM Graph,除了使用支持Gremlin的TinkerPop API以外,这项服务还提供其他用于基础检索的简单API。
后起之秀们的故事
近年来,Neo4J已经成为最具影响力的图数据库之一,而且目前仍是这一领域的领导者。但其仍是一家独立企业,因此在本文中同样被纳入“后起之秀”的范畴。顺带一提,其实很多参与图数据库市场的厂商都有着悠久的发展历史。
Neo4J鼓励其他公司通过OpenCypher项目使用其查询语言Cypher。此外,Neo4J也是GQL标准化进程的主要推动者,同时支持使用GraphQL执行一部分查询。
TigerGraph选择的是存储属性图并使用GSQL进行查询的路线,这是一种简化并发处理工实现大规模数据集扩展能力的过程性方法。该数据库背后的厂商提供一款复杂的可视化工具GraphStudio,能够以产品及云服务的形式供用户探索并查询数据集内容。
OrientDB则是一套开源数据库,可使用Gremlin和SQL进行查询。它的缔造厂商已经被SQP所收购,因此相关产品目前正在与SAP自家产品线进行集成。
ArangoDB在设计上支持图与NoSQL文档数据集。这款开源数据库既提供社区版,也提供服务形式的付费商业版。其关联的查询语言被称为SQL,提供的是过程性数据搜索方法。
AllegoGraph存储RDF图,并使用SPARQL、RDFS++以及多种编程语言扩展(例如逻辑编程语言Prolog,以及Allegro Common LISP)实现查询。其知识图谱浏览器Gruff能够在常规网络浏览器中运行,借此实现可视化查询。该产品同时适用于本地安装和亚马逊云科技等公有云平台。
Ontotext专注于创建大型知识图谱,其GraphDB可支持对RDF图执行SPARQL查询。Ontotext提供三个版本(免费版、标准版与企业版),三者的功能基本相同,但免费版仅支持两项并发查询。
图数据库查询语言有哪些局限?
图查询语言的核心,在于提供一种简洁的方式以搜索匹配特定模式的特定条目组合。但有些问题,无论其内容多么明确,都很难通过图查询语言得到有效回答。
以查找“团”(即相互间高度连接的顶点子集)为例,虽然这个问题本身属于NP完全问题,但可能难以通过图查询语言得到有效解决。随着问题规模的扩大,寻找答案的时间往往呈指数级增长——换句话说,这些问题不具备可扩展性。如果错误使用图查询语言,我们很可能在不经意间写出一条需要极长时间才能解决的高成本查询。