SPARQL(一)

来源:互联网 发布:优化好的单机游戏 编辑:程序博客网 时间:2024/06/09 19:49

本文是对使用 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-listWHERE{    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 ?namewhere{//查出名字为“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/>                    |-----------------------------------------------

语法关键字

  1. 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 ?sWHERE {   ?s foaf:name "Michael Carducci" }//PREFIX 别名:别名值;上句查询等同于以下:select ?swhere{    ?s <http://xmlns.com/foaf/0.1/name> "Michael Carducci" }

6.二次查询:有些查询必须使用组合语句,比如“名字属性为MC的主体的所有信息”。匹配模式语句中第一次查询出的常量可以作为输入,继续进行查询,两句查询语句用分号分割就好:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>SELECT ?p ?oWHERE {   ?s foaf:name "Michael Carducci";//查出了名字为MC的主语    ?p ?o .//上行主语作为输入,求其谓语、宾语}

7.DESCRIBE和a的使用:

PREFIX ex: <http://example.com/ns/>DESCRIBE ?sWHERE {  ?s a ex:Magician}/* *1.使用糖衣语法a避免完整指定RDF type属性:<XXX#type>; *组合使用DESCRIBE;*/

重要:注意事项

  1. 查询文件内容不区分大小写,但不能有分号;
  2. 2.
原创粉丝点击