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更具表现力,因为它接受 extensional 和 intensional 谓词(或关系)。到目前为止,RQL只处理集约关系。
2.1.3. 不同类型的查询¶
- 搜索 (Any )
提取实体和实体属性。
- 插入实体 (INSERT )
在数据库中插入新的实体或关系。它还可以直接为新创建的实体创建关系。
- 更新实体,创建关系 (SET )
更新数据库中的现有实体,或在现有实体之间创建关系。
- 删除实体或关系 (DELETE )
删除数据库中现有的实体或关系。
2.1.4. RQL关系表达式¶
rql表达式应用于由 山药 图式 .除了表达式的主类型或头(搜索、插入等),RQL表达式最常见的组成部分是一组关系表达式。
RQL关系表达式包含三个组件:
主题,它是实体类型
谓词,它是关系定义(模式的弧)
对象,它要么是属性,要么是与另一个实体的关系。

警告
关系总是按以下顺序表示: subject
, predicate
, object
.
要构造有效的表达式,必须确定实体类型是Subject还是Object。倒置主题/对象是一个错误,因为在架构中找不到关系。
如果没有访问代码的权限,可以通过在管理器视图中查看模式图像来查找顺序(主题位于箭头的开头)。
两个相关关系表达式的示例:
P works_for C, P name N
RQL变量表示类型化实体。实体的类型可以自动推断(通过查看可能的关系定义,请参见 关系定义 )或者使用 is
元关系。
在上面的示例中,我们几乎不需要查看模式。如果变量名(在rql表达式中)和关系类型名(在模式中)是明确设计的,那么人类读者可以推断出 CubicWeb 发问者。
这个 P
变量被使用两次,但它始终表示同一组实体。因此 P works_for C
和 P name N
必须在所有PS(即 can 引用不同的实体类型)必须接受 works_for
和 name
关系类型。这确实限制了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表达式的头部可以使用各种运算符完成,例如 ORDERBY
, GROUPBY
, HAVING
, LIMIT
等。
RQL关系表达式可以分组为 UNION
或 WITH
.面向谓词的关键字,如 EXISTS
, OR
, NOT
是可用的。
RQL运营商的完整动物园在下一章中进行了详细描述。 (RQL语法 )