本文是对使用 SPARQL 查询 RDF 数据的汇总演示,详情请点击原文及原文引用文章。
subject:主语;Object:宾语;property:属性(关系);
前置准备
一.使用工具为Apache Jena的命令行工具,需要添加JEAN_HOME和在path中加入%JENA_HOME%/bin;
二.下载示例使用资源,后边会有介绍,也可以自己写;
一.基本使用方式
/*配置好环境后,在资源文件目录运行*/
sparql --query query.rq --data basic.nt
1.–query后边表示要运行的查询语句所在的文件;–data表示所要查询的数据文件;
2.查询文件rq后缀约定俗称,怎么写都能成功运行。但是数据文件的后缀在用于区分数据文件格式,只要使用一种适合序列化格式的标准后缀,sparql 工具就会正确地解析该格式(例如,.ttl 用于 Turtle图表,.rdf 用于 RDF/XML,.nt 用于 N-Triples);
3.query.rq中查询语句
select ?s ?p ?o where { ?s ?p ?o }
//类似于SQL的select,但是其查询元素只有三元组子集,一般使用方式如下:
SELECT variable-list
WHERE{
graph pattern //可以使用通配符,like等
}
如果想要询问特定节点的问题,您可以在模式的主语位置指定这些节点。如果想要知道一个特定属性的值,可以在模式的谓语位置指定该属性。任何您不想指定的元素都可由一个变量来表示,该变量将映射到该位置存在的任何可能值。如果不指定模式的任何部分,则会实际要求图形中的所有元组扁平化到一个结果集中。
4.数据文件basic.nt内容
//
<https://w3id.org/people/bsletten> <http://xmlns.com/foaf/0.1/birthday> "05-26" .
<https://w3id.org/people/bsletten> <http://xmlns.com/foaf/0.1/name> "Brian Sletten" .
<https://w3id.org/people/bsletten> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> .
//可以看出数据格式是<a> <b> <c> .,其中三元组元素之间用空格隔开,最后一英文句号结尾,最后一个元素可以用""代替<>,猜测应该分别表示数据属性和对象属性
也可以将数据存放在Turtle 文件中,如示例中basic.ttl
<https://w3id.org/people/bsletten>
a <http://xmlns.com/foaf/0.1/Person> ;
<http://xmlns.com/foaf/0.1/birthday>
"05-26" ;
<http://xmlns.com/foaf/0.1/name>
"Brian Sletten" .
<https://w3id.org/people/mcarducci>
a <http://example.com/ns/Magician> ;
<http://xmlns.com/foaf/0.1/homepage>
<http://michaelcarducci.com> ;
<http://xmlns.com/foaf/0.1/name>
"Michael Carducci" .
//可以看出数据格式为 主体 属性1 属性值1;属性2 属性值2. 最后.表示此主体的描述结束;
5.如上所述,查询特定主语、谓语或者宾语的数据信息时,只需要所要查询数据的常量值放在对应位置即可,示例如下
//查询主语为XX的三元组谓语、宾语信息
select ?p ?o where { <https://w3id.org/people/mcarducci> ?p ?o }
因为查询某个特定资源/主语的请求比较常用,因此sparql提供了另一种查询方式DESCRIBE,而且其结果集不是表格,而是图表:
DESCRIBE <https://w3id.org/people/mcarducci>
6.当我们需要使用多个数据源时:
sparql --query query.rq --data source1 --data source2 --data...
例如我们为以下数据添加关联:Brian “知道”Michael
<https://w3id.org/people/bsletten>
a <http://xmlns.com/foaf/0.1/Person> ;
<http://xmlns.com/foaf/0.1/birthday>
"05-26" ;
<http://xmlns.com/foaf/0.1/name>
"Brian Sletten" .
<https://w3id.org/people/mcarducci>
a <http://example.com/ns/Magician> ;
<http://xmlns.com/foaf/0.1/homepage>
<http://michaelcarducci.com> ;
<http://xmlns.com/foaf/0.1/name>
"Michael Carducci" .
Brian “知道”Michael 这个新的三元组关系在另一个ttl中做如下表示:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
<https://w3id.org/people/bsletten>
foaf:knows <https://w3id.org/people/mcarducci>
用如下语句查询,每一句查询一个属性:
PREFIX ex:<http://example.com/ns/>
PREFIX foal<http://xmlns.com/foaf/0.1/>
select ?magician ?name
where{
//查出名字为“BS”的主体,查出这些主体知道的宾语,用?magician标识返回;
?s foaf:name "B S";
foaf:knows ?magician.
//查出#type类型为M的?m,找出其name属性值,用?name标识返回;
?magician a ex:Magician;
foaf:name ?name;
7.查询远程数据:将链接作为一个数据源即可,放在 –data 后边,示例如下:
sparql --query interests.rq --data basic.ttl --data knows.ttl --data https://w3id.org/people/bsletten
查询文件内容为
select ?interest where {
?s <http://xmlns.com/foaf/0.1/interest> ?interest ;
<http://xmlns.com/foaf/0.1/knows> ?magician .
?magician a <http://example.com/ns/Magician> ;
<http://xmlns.com/foaf/0.1/name> "Michael Carducci".
//代码运行是自下而上的
}
输出结果为:
-----------------------------------------------
| interest |
===============================================
| <http://dbpedia.org/page/Fish_%28singer%29> |
| <http://dbpedia.org/resource/Sushi> |
| <http://dbpedia.org/resource/Phish> |
| <http://www.w3.org/2000/01/sw/> |
| <http://www.w3.org/Metadata/> |
| <http://www.w3.org/RDF/> |
-----------------------------------------------
语法关键字
- limit:同mysql,放在语句最后
select ?s ?p ?o where { ?s ?p ?o } limit 10
2.distinct:位置同mysql,修饰跟着的所有属性
select distinct ?s where { ?s ?p ?o }
//如果...distinct ?s ?p,则s和p都一样则只显示一个;
3.PREFIX:前缀别名
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?s
WHERE
{
?s foaf:name "Michael Carducci"
}
//PREFIX 别名:别名值;上句查询等同于以下:
select ?s
where
{
?s <http://xmlns.com/foaf/0.1/name> "Michael Carducci"
}
6.二次查询:有些查询必须使用组合语句,比如“名字属性为MC的主体的所有信息”。匹配模式语句中第一次查询出的常量可以作为输入,继续进行查询,两句查询语句用分号分割就好:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?p ?o
WHERE
{
?s foaf:name "Michael Carducci";//查出了名字为MC的主语
?p ?o .//上行主语作为输入,求其谓语、宾语
}
7.DESCRIBE和a的使用:
PREFIX ex: <http://example.com/ns/>
DESCRIBE ?s
WHERE {
?s a ex:Magician
}
/*
*1.使用糖衣语法a避免完整指定RDF type属性:<XXX#type>;
*组合使用DESCRIBE;
*/
重要:注意事项
- 查询文件内容不区分大小写,但不能有分号;
- 2.