RDF 通识说明

2022-01-08  本文已影响0人  走在成长的道路上

RDF 定义

RDF 知识库

RDF 字典(Schema)定义数据建模的元数据项,包含 classproperty 两种类型。

class 表示对象实例,类似面向对象编程中的 classproperty 分为 属性(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
}
上一篇 下一篇

猜你喜欢

热点阅读