本文主要是介绍论文注解《Query Languages for Graph Databases》graph数据库查询语法(I),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
概述
这篇paper主要介绍了历史上的graph数据库查询语法的发展和用途,并从查询处理的表达能力和计算复杂性做出评估
简介
- 对于一个graph数据库 G 最简单的形式为
(V,E) ,其中 V 是有限点集,E 是连接点对的有限边集(有向|无向)。在大多数的应用场景中点和边往往以某种形式被打上标签(例如 属性-值),且用字符 ∑ 表示打标签的过程,即 E⊆V×∑×V 。有些应用环境则需要更精巧的graph化的数据结构,例如用于对超文本建模的超图,它的节点就可以由图构成。除此之外,在一些graph数据模型中,每个graph均需要对应特定的架构( schema )。
Figure 1... - paper中用一张图来表示阐释这种模式,举个查询的例子:找出同时获得 Booker 和 Nobel 奖的作者——一种简单的联合查询 CQ ,可利用以下语法来表示该次查询 ans(x)←(x,hasWon,Nobel),(x,hasWon,Booker)......(1)其中 x 代表节点,
hasWon,Nobel,Booker 代表常量。这种语法类似于 Datalog ,但是查询主体中的元素不包含谓词。实际上这些元素更像是三元组( triple patterns 被用于 SPARQL )或 W3C 查询语言( RDF ) - 为了在graph中找出点对 (x,y) 表示存在一条从 x 到
y 的路径 P=ea,eb,ec,... 且序列 labela,labelb,labelc,... 符合某种模式。一种做法是用正则表达式指定该模式,这种查询被称作 RPQ 。例如(x,(citizenOf|((bornIn|livesIn)⋅locatedIn∗)),y)CQ 和 RPQ 可以组合成一种新的形式 CRPQ ,例如ans(x,y)←(x,hasWon,Nobel),(x,hasWon,Booker)(x,(citizenOf|((bornIn|livesIn)⋅locatedIn∗)),y)......(2)在 GraphLog 中的表示形式如下
Figure 2...
图中较粗的边被称作 distinguished edge ,代表出现在结果中的边,需要与查询头部相对应 - 当需要表示路径之间的关系时, CRPQ 就显得不够强大,因此需要一种新的查询语法 ECRPQ 。例如 (x,y)←(Coetzee,π,y),(x,π,y),Σ∗(π)找出实体 x 和
y ,两者间路径上标签的序列等同于 Coetzee 和 y 之间。π 代表可行的路径, Σ∗ 代表标签的序列。
查询语言功能
子图匹配
- 子图查询是被最广泛支持的一种图查询模式。以 CQ 为例,设可用点集为 (x,y,z,...) ,则查询语句的形式可以是 ans(z1,...,zn)←⋀1≤i≤m(xi,ai,yi)设 x¯=(x1,x2,...xm) , y¯=(y1,y2,...ym) , z¯=(z1,z2,...zn) ,需要指定 x¯ , y¯ 到 G=V,E) 点集的映射关系 σ : (G,σ)⊨Q ,使 (σ(xi),ai,σ(yi))∈E 。在某些应用领域,数据库本身就是由graph的集合组成,其查询结果需要返回匹配的子集。
- 尽管 CQ 在某种意义上是最简单的graph查询模式,但是研究难点在于找到一种有效的方式去评估其在大规模graph查询中的表现。因为针对 CQ 计算 QEP 的复杂度等同于子图同构问题(NP问题)。因此,业内正在研究基于graph模拟的graph模式匹配。
发现路径所连的节点
- 设 G=(V,E) , v0、v1∈V , v0、v1 之间存在一条路径 ρ=v0a0v1a1v2a2...vm−1am−1vm ,路径上标签的序列为 λ(ρ)=a0...am−1∈Σ∗
正则路径查询( RPQ )
- 计算和决定节点间的可达性这种查询机制存在于绝大部分graph查询语言中。 RPQ 通常返回与一条路径相连的所有符合正则表达式的点对集合。其形式为 ans(x,y)←(x,r,y)......(3)x 和
y 为可用的节点, r 为正则表达式(用| 表示析取, ⋅ 表示,并保留简写r+⇒(r⋅r∗)、r?⇒(r|ϵ)、Σ⇒(a1|...|an)、a−⇒ 任何标记为 a 的反向边)。 - 正则路径查询的难点在于针对给出的查询
Q 和点对 (x,y) ,如何判断 (x,y)∈Q(G)? 有一种算法如下:
- 构造一个非确定性的有穷自动机( NFA ) Mr (初始状态 s0 终止状态 s1 )来接收 L(r)
- 将 G 视作一个拥有初始状态
x 终止状态 y 的NFA - 构建自动机的乘积 Mr×G
- 判断在 Mr×G 是否存在从 (s0,x) 到 (sf,y) 的路径
- 算法中的每个步骤是PTIME的复杂度,因此正则路径查询问题的总体复杂度是 ∑PTIME
- 或者,我们可以按照 Datalog 的规则把 Q 转化为一组集合,例如正则表达式
citizenOf|((bornIn|livesIn)⋅locatedIn∗) 可转化为
ans(x,y)←citizenOf(x,y)
ans(x,y)←assoc(x,y)
ans(x,y)←assoc(x,z),partOf(z,y)
assoc(x,y)←bornIn(x,y)
assoc(x,y)←livesIn(x,y)
partOf(x,x)←locatedIn(x,x)
partOf(x,y)←locatedIn(x,z),partOf(z,y) - 有时我们可能仅仅想在 G 中找出的匹配正则表达式
r 的简单路径(当一条路径 ρ 中没有重复的节点时则将其定义为简单路径)。所以正则简单路径问题可以被阐明为:给定G 、点对 (x,y) 和正则表达式 r ,判断是否存在一条从x 到 y 且匹配r 的简单路径。然而,这个问题居然tm的是个 NP 问题,即使对于固定的正则表达式。
这篇关于论文注解《Query Languages for Graph Databases》graph数据库查询语法(I)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!