0

执行查询时出现错误,在 '_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 owl: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 ?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{可选{dbr:Eraring,_New_South_Wales ?_type}} UNION{可选{dbr:Eraring,_New_South_Wales dbo:capital ?capital}} UNION{可选{dbr:Eraring,

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

4

1 回答 1

1

您正在尝试在查询中使用前缀名称,错误消息表明

dbr:Eraring,_New_South_Wales

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

那么让我们看一下W3C的推荐:

4.1.1.1 前缀名称

PREFIX 关键字将前缀标签与 IRI 相关联。前缀名称是前缀标签和本地部分,用冒号“:”分隔。通过连接与前缀相关联的 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关键字用于内联数据
于 2019-01-25T13:30:48.130 回答