图交互式工作负载¶
图交互式工作负载主要专注于以交互式方式探索复杂的图结构。常见的交互式工作负载有两种,分别是
图遍历:这类工作负载涉及从一组源顶点出发遍历图,同时满足遍历路径上顶点和边的约束条件。图遍历与分析工作负载不同,它通常只访问图的一小部分而非整个图。
模式匹配:给定一个小图作为模式,图模式匹配的目标是计算图中该模式的所有出现(或实例)。模式匹配通常涉及关系操作来投影、排序和分组匹配到的实例。
在GraphScope中,我们开发了图交互引擎(GIE)来处理这类交互式工作负载,它提供了广泛使用的查询语言,如Gremlin或Cypher,使用户能够轻松表达图遍历和模式匹配查询。这些查询将在机器集群中以大规模并行方式执行,为图交互工作负载提供高效且可扩展的解决方案。
Tinkerpop与Gremlin¶
Apache TinkerPop 是一个开源框架,用于使用 Gremlin 查询语言开发交互式图应用程序。我们实现了TinkerPop的Gremlin Server接口,并尝试在GIE中支持Gremlin的官方遍历步骤。因此,Gremlin用户可以通过现有的TinkerPop生态系统轻松开始使用GIE,包括Python语言包装器和Gremlin控制台。 在语言特性方面,我们同时支持Gremlin中的命令式图遍历和声明式模式匹配,分别用于处理交互场景下的图遍历和模式匹配工作负载。
图遍历¶
在命令式图遍历中,执行过程严格遵循查询指定的步骤,其中一组遍历器会根据用户提供的指令逐步遍历图结构,遍历的最终结果是所有停止的遍历器的集合。遍历器是Gremlin引擎处理数据的基本单元。每个遍历器都维护着一个位置引用,指向当前访问的顶点、边或属性,并可选择性地携带包含应用状态的路径历史记录。
用于检测环的遍历查询。¶
上图展示了一个通过环路检测实现的简化反洗钱场景。
以下是相应的遍历查询,它试图从给定账户出发寻找长度为
k的循环路径。
g.V('account').has('id','2').as('s')
.out('k-1..k', 'transfer')
.with('PATH_OPT', 'SIMPLE')
.endV()
.where(out('transfer').eq('s'))
.limit(1)
首先,源操作符V(带有has()过滤器)返回所有id为2的账户顶点。as()操作符是一个调节器,它不会改变遍历器的输入集合,但会为后续引用引入一个名称(本例中为s)。其次,通过使用下限为k-1(包含)和上限为k(不包含)的out()步骤,遍历出向transfer边恰好k-1次,同时使用SIMPLE路径选项跳过任何重复顶点。这种多跳路径扩展是我们为方便处理路径相关应用而引入的语法糖。第三,where操作符检查起始顶点s是否可以通过再多一步到达,即是否形成长度为k的环。最后,末尾的limit()操作符表示只需要一个这样的结果。
模式匹配¶
不同于命令式遍历查询,match()步骤提供了一种声明式的模式匹配查询表达方式。换句话说,用户只需使用match()描述模式是什么,引擎将基于算法启发式和成本估算自动推导出最佳执行计划。
模式匹配的一个示例。¶
上图展示了一个模式匹配查询的示例,其中模式是一个三角形,描述了两个相互认识的买家购买同一件商品。在图中,有一个匹配实例以加粗边框高亮显示,其中模式顶点v1、v2和v3分别与顶点1、2和5相匹配。
g.V().match(
as('v1').both('Knows').as('v2'),
as('v1').out('Purchases').as('v3'),
as('v2').out('Purchases').as('v3'),
)
模式匹配查询具有声明式的特性,用户只需通过match()步骤描述模式,而引擎会根据预定义的成本模型在运行时决定如何执行查询(即执行计划)。例如,一个最坏情况最优的执行计划可能首先计算v1和v2的匹配项,然后将v1和v2的邻居交集作为v3的匹配项。
Neo4j与Cypher查询语言¶
Neo4j是一款广受欢迎的图数据库管理系统,以其原生图处理能力而闻名。它为存储、查询和分析图数据提供了高效且可扩展的解决方案。Neo4j的核心组件之一是专为图数据设计的查询语言Cypher。我们通过实现Cypher中关键且高效的运算符,充分释放了Neo4j的潜力,使用户能够利用Cypher强大的表达能力来查询和操作图数据。此外,我们还将Neo4j的Bolt服务器集成到系统中,使Cypher用户可以通过开放SDK提交查询。因此,Cypher用户可以通过现有的Neo4j生态系统(包括Python语言封装器和Cypher-Shell)轻松开始使用GIE。
模式匹配¶
Cypher中的MATCH运算符提供了一种声明式语法,让您能够以简洁直观的方式表达图模式。这种基于模式的方法与图数据的结构高度契合,使得查询语句更易于理解和编写。无论是初学者还是资深用户,都能快速掌握并处理复杂的图模式。此外,MATCH运算符允许您组合多种模式、可选模式以及逻辑运算符来构建复杂查询,使您能够在单个查询中表达复杂的关系和条件。针对上述Triangle示例,可以用Cypher编写如下:
Match (v1)-[:Knows]-(v2),
(v1)-[:Purchases]->(v3),
(v2)-[:Purchases]->(v3)
Return DISTINCT v1, v2, v3;