在SPARQL,DBpedia上搜索时出现逗号错误

时间:2019-01-23 06:05:34

标签: sparql dbpedia sparqlwrapper

执行查询时给出错误,在'_New_South_Wales'之前的','处出现语法错误。

PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/property/>
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX grs: <http://www.georss.org/georss/>
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>

SELECT ?label ?country ?isPartOf ?_type ?capital ?lcity ?geopoint
WHERE {
        { dbr:Eraring,_New_South_Wales rdfs:label ?label  .  FILTER(LANGMATCHES(LANG(?label), "en"))}
          UNION{OPTIONAL{dbr:Eraring,_New_South_Wales dbo:country ?country} }
          UNION{OPTIONAL{dbr:Eraring,_New_South_Wales dbo:isPartOf ?isPartOf}}
          UNION{OPTIONAL{dbr:Eraring,_New_South_Wales <http://purl.org/linguistics/gold/hypernym> ?_type}}
          UNION{OPTIONAL{dbr:Eraring,_New_South_Wales dbo:capital ?capital}}
          UNION{OPTIONAL{dbr:Eraring,_New_South_Wales dbo:largestCity ?lcity}}
          UNION{OPTIONAL{dbr:Eraring,_New_South_Wales grs:point ?geopoint}}
  }

完整的错误报告如下。

  

Virtuoso 37000错误SP030:SPARQL编译器,第21行:在'_'语法错误,在'_New_South_Wales'SPARQL查询之前:#output-format:application / sparql-results + json定义输入:default-graph-uri PREFIX猫头鹰: PREFIX xsd:PREFIX rdfs:PREFIX rdf:PREFIX foaf:PREFIX dc:PREFIX:PREFIX dbpedia2:PREFIX dbpedia:PREFIX skos:PREFIX dbo:PREFIX dbp:PREFIX dbr:PREFIX grs:PREFIX geo:SELECT?label?country?isPartOf?type ?资本?地理位置?地点在{{dbr:Eraring,_New_South_Wales rdfs:label?label。 FILTER(LANGMATCHES(LANG(?label),“ en”))} UNION {可选{dbr:Eraring,_New_South_Wales dbo:country?country}} UNION {可选{dbr:Eraring,_New_South_Wales dbo:isPartOf?isPartOf}} UNION { {OPTIONAL {dbr:Eraring,_New_South_Wales?_type}} UNION {OPTIONAL {dbr:Eraring,_New_South_Wales dbo:capital?capital}} UNION {OPTIONAL {dbr:Eraring,_New_South_Wales dbo:largestCity?lcityAL} {UNAL} ,_New_South_Wales grs:point?geopoint}}}

这是您可以自行测试此查询的链接。 snorql

1 个答案:

答案 0 :(得分:1)

您正在尝试在查询中使用前缀名称,并且错误消息指示

dbr:Eraring,_New_South_Wales

作为错误的来源,特别是逗号使解析器失败。

因此,让我们看一下W3C建议:

  

4.1.1.1前缀名称

     

PREFIX关键字将前缀标签与IRI关联。带前缀   name是前缀标签和局部部分,以冒号“:”分隔。一种   通过连接关联的IRI,将前缀名称映射到IRI   加上前缀和本地部分。前缀标签或本地部分   可能是空的。请注意,SPARQL本地名称允许前导数字,而   XML本地名称没有。 SPARQL本地名称还允许   通过反斜杠字符在IRI中允许使用非字母数字字符   转义(例如ns:id \ = 123)。 SPARQL本地名称具有更多语法   限制超过CURIE。

鉴于该错误发生在本地名称中,并且逗号是一个非字母数字字符,此处最重要的部分是

  

SPARQL本地名称还允许使用非字母数字字符   在IRI中通过反斜杠字符转义(例如ns:id \ = 123)

这意味着,我们可以使用逗号,但必须通过\将其转义,即我们必须编写

dbr:Eraring\,_New_South_Wales

不幸的是,考虑到

这样的查询,Virtuoso解析器似乎有一些问题(或者我在这里做错了)
SELECT * { dbr:Eraring\,_New_South_Wales ?p ?o }

失败

Virtuoso 37000 Error SP030: SPARQL compiler, line 0: Bad character '\' (0x5c) in SPARQL expression at '\'

一个始终有效的选择确实是只使用完整的IRI。

在DBpedia端点上运行的查询是

PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/property/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX grs: <http://www.georss.org/georss/>
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>

SELECT ?label ?country ?isPartOf ?_type ?capital ?lcity ?geopoint WHERE {
 VALUES ?s {<http://dbpedia.org/resource/Eraring,_New_South_Wales>} 
 ?s rdfs:label ?label . 
 FILTER(LANGMATCHES(LANG(?label), "en")) 
 OPTIONAL{?s dbo:country ?country} 
 OPTIONAL{?s dbo:isPartOf ?isPartOf} 
 OPTIONAL{?s <http://purl.org/linguistics/gold/hypernym> ?_type} 
 OPTIONAL{?s dbo:capital ?capital} 
 OPTIONAL{?s dbo:largestCity ?lcity} 
 OPTIONAL{?s grs:point ?geopoint} 
}

您可以看到我对查询做了一些修改:

  • 不需要UNION子句–您只需要获取 可选数据(如果存在),因此OPTIONAL是正确的SPARQL功能
  • 我将VALUES关键字用于内联数据