RDF
定义
-
R
代表Resource
,即资源,任何可以被唯一标识的对象,都可以称为资源。例如,网页、地点、人、事件、餐馆等; -
D
代表Description
,也就是说对资源的描述,包括资源属性的描述和资源间关系的描述; -
F
则是指Framework
,即RDF
为资源描述提供了描述的语言和模型。
RDF
知识库
RDF
字典(Schema
)定义数据建模的元数据项,包含 class
和 property
两种类型。
class
表示对象实例,类似面向对象编程中的 class
,property
分为 属性(attribute) 和 关系(relationship) 两类。
RDF
字典的定义自身也是一个 RDF graph
, 即 RDF
是自描述的数据模型,是一种 schema-free 的数据模型。
sparql
查询语句类型
注
下面查询命令使用 d2r-server
启动之后,以某个表结构即可进行测试
语句类型 | 描述 |
---|---|
SELECT | 从 RDF 中选择出满足条件的资源或者属性; |
CONSTRUCT | 根据条件获取满足条件的 Triple 并以此生成一个新的 RDF 数据集; |
DESCRIBE | 获取用户输入的资源的所有属性描述; |
ASK | SELECT 的优化版本,它只检查是否存在满足条件的资源或者属性,但不需要全部找出。 |
SELECT
查询语句
如下以电影库为例进行举例说明
1. 基础语法
# 基础查询语句格式如下所示:
#
# PREFIX <前缀定义>
# SELECT [结果字段, ....]
# WHERE { 条件语句 }
# ORDER BY [排序字段] DESC/ASC
# LIMIT 数量
#
SELECT *
# 填充查询条件
WHERE {
?s ?p ?o
}
# 输出前十条记录
LIMIT 10
2. 多条件查询
# 定义前缀
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
# 输出 ?n 属性值
SELECT ?n
# 填充查询条件
WHERE {
# 查询条件,以 `.` 来表示单个查询条件,单subject 多个条件时可以用 `;` 进行链接
# 如下表示查询 rdf:type = :Person and :personName = '巩俐' 的人
?s rdf:type :Person ; :personName '巩俐'.
# 再将人与电影进行关联,获取到电影名称和电影的评级
?s :hasActedIn ?o.
?o :movieTitle ?n.
?o :movieRating ?r.
}
# 输出前十条记录
LIMIT 10
3. 字段过滤
# 定义前缀
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
# 输出 ?n 属性值
SELECT ?n
# 填充查询条件
WHERE {
# 查询条件,以 `.` 来表示单个查询条件,单subject 多个条件时可以用 `;` 进行链接
# 如下表示查询 rdf:type = :Person and :personName = '巩俐' 的人
?s rdf:type :Person ; :personName '巩俐'.
# 再将人与电影进行关联,获取到电影名称和电影的评级
?s :hasActedIn ?o.
?o :movieTitle ?n.
?o :movieRating ?r.
# 过滤出评级大于等于 7 的电影
FILTER (?r >= 7)
}
# 输出前十条记录
LIMIT 10
注
在 WHERE
语句中仅 FILTER
后面语句中能使用函数, 常见函数列表查看下面参考链接内容
4. 聚合
# 定义前缀
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
# 输出 ?n 并重命名为 ?NAME, 聚合函数为 count 并重命名为 ?NELEMENTS 属性值
SELECT (?n AS ?NAME) (COUNT(?o) as ?NELEMENTS)
# 填充查询条件
WHERE {
# 查询条件,以 `.` 来表示单个查询条件,单subject 多个条件时可以用 `;` 进行链接
# 如下表示查询 rdf:type = :Person and :personName = '巩俐' 的人
?s rdf:type :Person ; :personName '巩俐'.
# 再将人与电影进行关联,获取到电影名称和电影的评级
?s :hasActedIn ?o.
?o :movieTitle ?n.
?o :movieRating ?r.
# 过滤出评级大于等于 7 的电影
FILTER (?r >= 7)
}
GROUP BY ?n
# 输出前十条记录
LIMIT 10
5. 排序
注
在 sparql
语句中的正/倒序与 sql
中的是有区别的,如下所示:
# 定义前缀
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
# 输出 ?n 并重命名为 ?NAME, 聚合函数为 count 并重命名为 ?NELEMENTS 属性值
SELECT (?n AS ?NAME) (COUNT(?o) as ?NELEMENTS)
# 填充查询条件
WHERE {
# 查询条件,以 `.` 来表示单个查询条件,单subject 多个条件时可以用 `;` 进行链接
# 如下表示查询 rdf:type = :Person and :personName = '巩俐' 的人
?s rdf:type :Person ; :personName '巩俐'.
# 再将人与电影进行关联,获取到电影名称和电影的评级
?s :hasActedIn ?o.
?o :movieTitle ?n.
?o :movieRating ?r.
# 过滤出评级大于等于 7 的电影
FILTER (?r >= 7)
}
GROUP BY ?n
# 按评级进行倒序排序,排序方式以函数的方式存在
ORDER BY DESC(count(distinct ?r)) ASC(?n)
# 上句 order by 语句也可以写成 ORDER BY DESC(?NELEMENTS) ASC(?n)
# 输出前十条记录
LIMIT 10
参考
ASK
语句
询问是否真实的语句,存在即返回为 true
# 语句中直接输入 WHERE 条件语句即可
ASK {
# 查询条件,以 `.` 来表示单个查询条件,单subject 多个条件时可以用 `;` 进行链接
# 如下表示查询 rdf:type = :Person and :personName = '巩俐' 的人
?s rdf:type :Person ; :personName '巩俐'.
# 再将人与电影进行关联,获取到电影名称和电影的评级
?s :hasActedIn ?o.
?o :movieTitle ?n.
?o :movieRating ?r.
}
CONSTRUCT
查询语句
按条件查询并输出查询结果的所有结构
# 注意这里需要使用 {} 来括起来哦
CONSTRUCT { ?s ?p ?o }
WHERE {
# 查询条件,以 `.` 来表示单个查询条件,单subject 多个条件时可以用 `;` 进行链接
# 如下表示查询 rdf:type = :Person and :personName = '巩俐' 的人
?s rdf:type :Person ; :personName '巩俐'.
# 再将人与电影进行关联,获取到电影名称和电影的评级
?s ?p ?o
}
参考
DESCRIBE
查询语句
按条件查询并输出查询结果并输出其相应的所有属性描述
DESCRIBE ?s
WHERE {
# 查询条件,以 `.` 来表示单个查询条件,单subject 多个条件时可以用 `;` 进行链接
# 如下表示查询 rdf:type = :Person and :personName = '巩俐' 的人
?s rdf:type :Person ; :personName '巩俐'.
# 再将人与电影进行关联,获取到电影名称和电影的评级
?s ?p ?o
}