欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Turtle RDF 和 SPARQL

程序员文章站 2022-03-04 13:08:45
...

Turtle 与 RDF/XML的对比:

<?xml version="1.0" encoding="utf-16"?>
<!DOCTYPE rdf:RDF >
<rdf:RDF 
	xml:base="http://example.org/" 
	xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
	xmlns:foaf="http://xmlns.com/foaf/0.1/"
	xmlns:rel="http://www.perceive.net/schemas/relationship/"
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
	<foaf:Person rdf:about="http://example.org/#green-goblin">
		<rel:enemyOf rdf:resource="http://example.org/#spiderman"/>
		<foaf:name>Green Goblin</foaf:name>
	</foaf:Person>
	<foaf:Person rdf:about="http://example.org/#spiderman">
		<rel:enemyOf rdf:resource="http://example.org/#green-goblin"/>
		<foaf:name>Spiderman</foaf:name>
	<foaf:name xml:lang="zh">蜘蛛侠</foaf:name>
	</foaf:Person>
</rdf:RDF>
@base <http://example.org/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix rel: <http://www.perceive.net/schemas/relationship/> .
<#green-goblin> rel:enemyOf <#spiderman> ;
a foaf:Person ; # in the context of the Marvel universe
foaf:name "Green Goblin".
<#spiderman> rel:enemyOf <#green-goblin> ;
a foaf:Person ;
foaf:name "Spiderman", "蜘蛛侠"@zh .

可以看到Turtle与XML相比更为精炼,也有着更高的可读性。

语法:

IRI:IRI以符号<>包裹,可以是绝对地址也可以是相对地址(< #spiderman>)
prefix:在文档开头,相当于XML的命名空间,格式为 @prefix namespace: < IRI > . ,也可以使用大写的PREFIX开头,格式为 PREFIX namespace: < IRI>。这里需要注意的是,@prefix必须以符号 . 结尾,而PREFIX则不需符号 . 。
property列表:同一个resource的property可以连续编写,使用 ; 分割。
object列表:相同resource和property的object可以连续编写,使用 , 分割。
每个resource的结尾使用 . 进行分割。
a 是一个property,等于rdf中的type。
一句标准的Turtle语句为:

<#subject> 
<#predicate> <#object>; 
<#predicate2> <#object2>, <#object3>.

字符串类型需要使用 " " 进行包裹。
在字符串之后接 @language 可以指定字符串所属语言,例如@en, @fr, @zh。还可以加数据类型标签,在符号 ^^ 之后,数据类型可以是绝对地址也可以是相对地址。

@prefix : <http://example.org/elements> .                                                                              
<http://en.wikipedia.org/wiki/Helium>                                                                                  
    :atomicNumber 2 ;               # xsd:integer                                                                      
    :atomicMass 4.002602 ;          # xsd:decimal                                                                      
    :specificGravity 1.663E-4 ;     # xsd:double
    :isLandlocked false .           # xsd:boolean

集合:
Turtle中的集合使用 () 来表示,集合可以作用在subject或object处。

@prefix : <http://example.org/foo> .
# the object of this triple is the RDF collection blank node
:subject :predicate ( :a :b :c  ) .

# an empty collection value - rdf:nil
:subject :predicate2 () .
@prefix : <http://example.org/stuff/1.0/> .
(1 2.0 3E1) :p "w" .

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    _:b0  rdf:first  1 ;
          rdf:rest   _:b1 .
    _:b1  rdf:first  2.0 ;
          rdf:rest   _:b2 .
    _:b2  rdf:first  3E1 ;
          rdf:rest   rdf:nil .
    _:b0  :p         "w" .

RDF中的空节点使用 _: 表示。空节点可以理解成我不知道具体是哪个对象,但我知道这个对象具有一些属性。此时就可以使用 [ ] 代替这一对象,并在其中描述其属性。

# 简写
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

[ foaf:name "Alice"  ] foaf:knows [
    foaf:name "Bob" ;
    foaf:knows [
    foaf:name "Eve" ] ;
    foaf:mbox <[email protected]> 
]
# 上述代码对应简单三元组

_:a <http://xmlns.com/foaf/0.1/name> "Alice" .
_:a <http://xmlns.com/foaf/0.1/knows> _:b .
_:b <http://xmlns.com/foaf/0.1/name> "Bob" .
_:b <http://xmlns.com/foaf/0.1/knows> _:c .
_:c <http://xmlns.com/foaf/0.1/name> "Eve" .
_:b <http://xmlns.com/foaf/0.1/mbox> <[email protected]> .

下面例子中,我们不知道editor对应的具体对象,但我们知道其fullname以及homepage。

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix ex: <http://example.org/stuff/1.0/> .

<http://www.w3.org/TR/rdf-syntax-grammar>
  dc:title "RDF/XML Syntax Specification (Revised)" ;
  ex:editor [
          ex:fullname "Dave Beckett";
          ex:homePage <http://purl.org/net/dajobe/>

  ] .

SPARQL

SPARQL共有四种查询方法:
SELECT:
CONSTRUCT:
ASK:
DESCRIBE:

基础语法:

SELECT时可以使用 ? 和 $ 表示变量,WHERE后接查询条件。
SELECT表示想要返回的数据部分,WHERE表示查询条件。
WHERE后接的是一个三元组,返回的是三元组匹配的数据。多个三元组查询时,使用符号 . 表示查询条件的与。
匹配时,变量之后的语言标签 @en 和类型标签 ^^ 都会参与匹配。
对于空节点的查询,返回结果不一定是原来的空节点。

条件查询:

在查询条件之后,可使用FILTER关键字对结果进行进一步删选:
对于字符串类型,可以使用关键字regex加正则表达式,对于数值类型,可以使用 <, >, = 判断其范围。

PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?title WHERE {?x dc:title ?title FILTER regex(?title, "^SPA.*L$”, “i”) }

PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX ns: <http://example.org/ns#>
SELECT ?title ?price WHERE { ?x ns:price ?price . FILTER (?price < 30.5) . ?x dc:title ?title . }

除了条件FILTER,还可以使用条件FILTER EXIST 和 FILTER NOT EXIST 后接三元组的方式,来过滤后续查询存在或不存在的结果。

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?person WHERE { ?person rdf:type foaf:Person . FILTER EXISTS { ?person foaf:name ?name }}

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?person WHERE { ?person rdf:type foaf:Person . FILTER NOT EXISTS { ?person foaf:name ?name } }

在查询条件的三元组中,同样可以使用符号 ; 和 , 表示subject和object列表。
使用OPTIONAL包裹的三元组为可选项,查询成功时会被返回,不匹配时返回空。

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox WHERE {?x foaf:name ?name . { ?x foaf:mbox ?mbox } }

在查询时还可以使用UNION连接多个三元组,类似于或。

PREFIX dc10: <http://purl.org/dc/elements/1.0/>
PREFIX dc11: <http://purl.org/dc/elements/1.1/>
SELECT ?title WHERE { { ?book dc10:title   }   { ?book dc11:title   } }

MINUS:类似于FILTER NOT EXIST,但又有区别,MINUS只是单纯的减掉,用在嵌套条件里会出错。
LIMIT:限制返回数。
BIND:创建一个临时变量并绑定新值。
VALUES:限制返回值,格式为 VALUES (?x ?y) {(x1 x2) (y1 y2)},下面例子为只返回book为book1或book3的值。
UNDEF:

PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX : <http://example.org/book/>
PREFIX ns: <http://example.org/ns#>
SELECT ?book ?title ?price { VALUES ?book { :book1 :book3 } ?book dc:title ?title ; ns:price ?price . }

分组操作:

GROUP BY
COUNT
SUM
MIN
MAX
AVG
GROUP_CONCAT
SAMPLE
ORDER BY
DISTINCT:去重
REDUCED:去重
HAVING:在分组之后使用,筛选分组,类似于删选单个的FILTER

OFFSET:去头

相关标签: 逻辑推理