2.1. 介绍

2.1.1. RQL的目标

目标是要有一种语义语言,以便:

  • 以清晰的语法查询关系

  • 允许访问数据存储库操作

  • 轻松浏览属性/关系

因此,属性将被视为特殊关系的情况(就用法而言,用户应该看不到属性和关系之间的语法差异)。

2.1.2. 与现有语言的比较

2.1.2.1. SQL

RQL可能会提醒SQL,但工作在更高的抽象级别(即 CubicWeb 框架从rql生成SQL以从关系数据库中获取数据)。RQL关注的是浏览关系。用户只需要知道 CubicWeb 他正在查询的数据模型,但与底层SQL模型无关。

2.1.2.2. SPARQL

与rql最相似的查询语言是 SPARQL, 由W3C定义,用于语义Web。

2.1.2.3. 反之亦然

我们应该看得更详细,但现在已经有了一些想法… Versa 语言是否与我们想要做的最相似,但是模型基础数据是RDF,有一些事情,比如名称空间或处理RDF类型,我们对此并不感兴趣。在功能级别上, Versa 是非常全面的,包括通过转换和基本类型操作的许多功能,我们可能希望一次或另一次看到这些功能。最后,语法有点深奥。

2.1.2.4. 数据日志

Datalog 是一个Prolog派生的查询语言,适用于关系数据库。它比RQL更具表现力,因为它接受 extensionalintensional 谓词(或关系)。到目前为止,RQL只处理集约关系。

2.1.3. 不同类型的查询

搜索 (Any

提取实体和实体属性。

插入实体 (INSERT

在数据库中插入新的实体或关系。它还可以直接为新创建的实体创建关系。

更新实体,创建关系 (SET

更新数据库中的现有实体,或在现有实体之间创建关系。

删除实体或关系 (DELETE

删除数据库中现有的实体或关系。

2.1.4. RQL关系表达式

rql表达式应用于由 山药 图式 .除了表达式的主类型或头(搜索、插入等),RQL表达式最常见的组成部分是一组关系表达式。

RQL关系表达式包含三个组件:

  • 主题,它是实体类型

  • 谓词,它是关系定义(模式的弧)

  • 对象,它要么是属性,要么是与另一个实体的关系。

<主语><谓语><宾语>

警告

关系总是按以下顺序表示: subjectpredicateobject .

要构造有效的表达式,必须确定实体类型是Subject还是Object。倒置主题/对象是一个错误,因为在架构中找不到关系。

如果没有访问代码的权限,可以通过在管理器视图中查看模式图像来查找顺序(主题位于箭头的开头)。

两个相关关系表达式的示例:

P works_for C, P name N

RQL变量表示类型化实体。实体的类型可以自动推断(通过查看可能的关系定义,请参见 关系定义 )或者使用 is 元关系。

在上面的示例中,我们几乎不需要查看模式。如果变量名(在rql表达式中)和关系类型名(在模式中)是明确设计的,那么人类读者可以推断出 CubicWeb 发问者。

这个 P 变量被使用两次,但它始终表示同一组实体。因此 P works_for CP name N 必须在所有PS(即 can 引用不同的实体类型)必须接受 works_forname 关系类型。这确实限制了p的可能值集。

添加另一个关系表达式::

P works_for C, P name N, C name "logilab"

这进一步限制了P的可能值,通过对 C .RQL级别 unification 在那里发生的事情被翻译成一个(或几个) joins 在数据库级别。

注解

CubicWeb ,术语 relation is often found without ambiguity instead of predicate. This predicate is also known as the property of the triple in RDF concepts

2.1.5. RQL操作员

RQL表达式的头部可以使用各种运算符完成,例如 ORDERBYGROUPBYHAVINGLIMIT 等。

RQL关系表达式可以分组为 UNIONWITH .面向谓词的关键字,如 EXISTSORNOT 是可用的。

RQL运营商的完整动物园在下一章中进行了详细描述。 (RQL语法