使用Turtle文件进行SPARQL查询(公共数据源)

时间:2017-03-04 16:52:56

标签: python sparql rdflib turtle-rdf

我是Turtle格式文件的新手,并使用SPARQL查询它们。所以我有很多问题需要解决,希望你能帮助我!

我有一个名为equipamentsCURT3.ttl的文件,其中包含以下内容:

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix v: <http://www.w3.org/2006/vcard/ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<http://opendata.gencat.cat/recursos/equipaments/30883> a v:VCard ;
v:adr [ a v:Work ;
        v:country-name "Spain" ;
        v:locality "Sabadell" ;
        v:postal-code "08202" ;
        v:region "Vallès Occidental" ;
        v:street-address " c.  Sant Josep" ] ;
v:category "2. Parvulari"@ca,
    "3. Educació primària"@ca,
    "4. Educació secundària obligatòria"@ca,
    "Educació. Formació"@ca,
    "Ensenyaments de règim general"@ca ;
v:fn "Escolàpies Sabadell"@ca ;
v:geo [ v:latitude 4.154826e+01 ;
        v:longitude 2.111243e+00 ] ;
v:nickname "Escolàpies Sabadell"@ca ;
v:tel [ a v:Pref,
            v:Tel,
            v:Work ;
        rdf:value "937255348" ] .

<http://opendata.gencat.cat/recursos/equipaments/31264> a v:VCard ;
v:adr [ a v:Work ;
        v:country-name "Spain" ;
        v:locality "Molins de Rei" ;
        v:postal-code "08750" ;
        v:region "Baix Llobregat" ;
        v:street-address " c.  Ntra. Sra. de Lourdes" ] ;
v:category "4. Educació secundària obligatòria"@ca,
    "7. Batxillerat"@ca,
    "8. Cicles formatius d'FP de grau mitjà (CFPM)"@ca,
    "9. Cicles formatius d'FP de grau superior (CFPS)"@ca,
    "Educació. Formació"@ca,
    "Ensenyaments de règim general"@ca ;
v:fn "Institut Bernat el Ferrer"@ca ;
v:geo [ v:latitude 4.14105e+01 ;
        v:longitude 2.02704e+00 ] ;
v:nickname "Institut Bernat el Ferrer"@ca ;
v:tel [ a v:Pref,
            v:Tel,
            v:Work ;
        rdf:value "936683762" ] .

<http://opendata.gencat.cat/recursos/equipaments/31265> a v:VCard ;
v:adr [ a v:Work ;
        v:country-name "Spain" ;
        v:locality "Castellar del Vallès" ;
        v:postal-code "08211" ;
        v:region "Vallès Occidental" ;
        v:street-address " NC  Bonavista" ] ;
v:category "2. Parvulari"@ca,
    "3. Educació primària"@ca,
    "Educació. Formació"@ca,
    "Ensenyaments de règim general"@ca ;
v:fn "Escola Bonavista"@ca ;
v:geo [ v:latitude 4.161903e+01 ;
        v:longitude 2.091745e+00 ] ;
v:nickname "Escola Bonavista"@ca ;
v:tel [ a v:Pref,
            v:Tel,
            v:Work ;
        rdf:value "937144195" ] .

我正在使用Python3.5和一个名为RDFLib(https://github.com/RDFLib/rdflib)的库。我需要从一个名为equipamentsCURT.rdf的文件中读取,将其序列化为equipamentsCURT3.ttl,然后检索与设备相关的所有信息。例如,对于设备30883 http://opendata.gencat.cat/recursos/equipaments/30883),我想要 v:adr,v:category,v:fn,v:geo和v:tel 。要获取此数据,我使用SPARQL,但我不知道为什么查询不起作用。我对如何查询信息感到很困惑。

这是我的代码:

import rdflib , pprint
from rdflib import URIRef, Graph
from rdflib.plugins import sparql

g = Graph()
g.load("equipamentsCURT3.ttl", format='turtle')

queryTest = 'prefix v: <http://www.w3.org/2006/vcard/ns#> ' \
'select ?y where {?x  a <http://opendata.gencat.cat/recursos/equipaments 30883>; ?y v:VCard .}'
qresult = g.query(queryTest)

for st in qresult:
 print rdflib.term.Literal(st).value

1 个答案:

答案 0 :(得分:1)

整个查询没有任何意义,也没有与数据匹配。 我建议先阅读SPARQL教程。整个查询看起来像是来自其他东西的复制粘贴+来自您身边的一些随机内容。

  1. URI http://opendata.gencat.cat/recursos/equipaments 30883包含错误的空格

  2. http://opendata.gencat.cat/recursos/equipaments/30883 一个类。因此,三重模式 ?x a <http://opendata.gencat.cat/recursos/equipaments/30883>,表示属于班级http://opendata.gencat.cat/recursos/equipaments/30883的所有资源都与您的数据不匹配。

  3. 第二个三重模式是?x ?y v:VCard。并且您选择谓词?y作为查询的最终结果。但是你想要给定主题和给定谓词集的对象。三重/ resp的语法。三重模式)是主谓词对象。因此,例如对于v:category,它应该是

  4. PREFIX v: <http://www.w3.org/2006/vcard/ns#> 
    SELECT ?o WHERE {
      <http://opendata.gencat.cat/recursos/equipaments/30883>  v:category ?o 
    }
    

    对于其他属性,它将更复杂,因为值本身是通过其他属性附加多个值的空白节点。例如。对于v:adr,它将是

    PREFIX v: <http://www.w3.org/2006/vcard/ns#> 
    SELECT ?p ?o WHERE {
      <http://opendata.gencat.cat/recursos/equipaments/30883>  v:adr ?adr .
      ?adr ?p ?o 
    }
    

    更新

    如果您不想要值,但属性是正确的,以使变量处于谓词位置。但是将它限制在仅与对象v:VCard一起出现的三元组中的属性是错误的,因为除了rdf:type之外没有这样的属性(a只是它的同义词)。在那种情况下它应该是

    PREFIX v: <http://www.w3.org/2006/vcard/ns#> 
    SELECT DISTINCT ?p WHERE {
      <http://opendata.gencat.cat/recursos/equipaments/30883>  ?p ?o 
    }