Turtle RDF 和 SPARQL
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:去头
上一篇: C#中使用Directory实现对文件夹的常用操作
下一篇: 怎么查看nodejs安装的模块
推荐阅读
-
python开发turtle安装和导入异常解决方案
-
Python-pip3 install turtle报错ERROR: Command errored out with exit status 和setup.py-except ValueErro
-
Python语言程序设计之二--用turtle库画围棋棋盘和正、余弦函数图形
-
python使用turtle库画正方形、矩形、三角形、多边形、同切圆和五角星等简单图形
-
python开发turtle安装和导入异常解决方案
-
Python小实例混合使用turtle和tkinter让小海龟互动起来
-
RDF查询语言SPARQL
-
利用turtle库画“冰墩墩”和奥运五环
-
python的turtle库认识和学习(3)之窗体大小和位置
-
RDF与SPARQL的一些知识整理