【问题标题】:How to escape special characters in SPARQL Prefixed Names?如何转义 SPARQL 前缀名称中的特殊字符?
【发布时间】:2019-03-25 12:35:06
【问题描述】:

我正在使用 SPARQL 和 Python 向 DBPedia 发出请求。

很遗憾,当我发送带有特殊字符(如括号)的请求时,我总是收到错误消息。

我试图用反斜杠转义它(如下面的代码),但它不起作用。

我读到我可以指定整个 URI,但它也不起作用(但我可能没有以正确的方式做到这一点)。

考虑到我已有的请求,是否有人有其他选择或可以提供一个示例,说明我如何使用整个 URI 编写请求?

query = """
    PREFIX : <http://dbpedia.org/resource/>
    SELECT DISTINCT ?s ?p ?o WHERE {
       {
           ?s ?p ?o
           FILTER (?s=:Grimaldi_\(crater\))

       }
    }
    """

这是我得到的错误:

QueryBadFormed: QueryBadFormed: a bad request has been sent to the endpoint, probably the sparql query is bad formed.

Response: b"Virtuoso 37000 Error SP030: SPARQL compiler, line 0: Bad character '\\' (0x5c) in SPARQL expression at '\\'\n\nSPARQL query:\n\n#output-format:application/sparql-results+json\n\n PREFIX : &lt;http://dbpedia.org/resource/&gt;\nSELECT DISTINCT ?s ?p ?o WHERE {\n {\n ?s ?p ?o\n FILTER (?s=:Grimaldi_\\(crater\\))\n\n }\n}\n"

【问题讨论】:

  • 我认为在查询的末尾有一个额外的)
  • 不,实际上只是因为此查询是我未在此处发布的某些代码的一部分...我只是忘记删除帖子中的)。但是感谢您的注意,我编辑了它!

标签: python escaping character sparql dbpedia


【解决方案1】:

full URI definitely works,如 --

SELECT DISTINCT ?s ?p ?o WHERE {
   {
       ?s ?p ?o
       FILTER ( ?s = <http://dbpedia.org/resource/Grimaldi_(crater)> )
   }
}

Virtuoso v7 在处理带有反斜杠转义的前缀名称时存在一个未解决的错误(例如您的:Grimaldi_\(crater\) 带有PREFIX : &lt;http://dbpedia.org/resource/&gt;,或者更常见的dbr:Grimaldi_\(crater\) 带有PREFIX dbr: &lt;http://dbpedia.org/resource/&gt;)。请将您的声音添加到the github issue,以帮助提高其优先级。

前缀名称中的反斜杠转义现在可以在支持 DBpedia 实例的 Virtuoso 7(07.20.3230,commit 5f68a2e2f2, 2019-04-01)中正常工作。

【讨论】:

  • 非常感谢,它与此解决方案完美配合。尝试使用完整 URI 时,我的合成器错误。一定会在 GitHub 上发表关于反斜杠的评论!
  • 那么...... .3230 版本上的任何 ETA 吗?
  • @Amadan - 假设您使用的是开源版(a/k/a VOS),您可以从develop/7 分支构建07.20.3230。如果您需要在stable/7,请将您的声音添加到the GitHub issue
  • 是的,我不确定我是否可以从源代码构建,系统非常锁定,充满了旧版本,而且我之前在使用其他软件时遇到过编译问题,所以我依赖于 VOS 二进制文件.感谢您的提示。
  • @phil294 — 我不知道我是否理解您的问题,这可能应该一个问题(而不是对答案的评论)。 ["[SPARQL] 的完整 URI 语法"](w3.org/TR/sparql11-query) 使用标准 HTTP/S URI,如 RFC 3986 中定义的那样,每个 URI 都用尖括号括起来(即 &lt;&gt;),并且使用"percent encoding" a/k/a/ "URL encoding" 作为保留字符。
【解决方案2】:

我们已经修复了这个问题(该问题是 7.x 而不是最近的 8.x 版本所特有的)并将其应用于 DBpedia-Snapshot 和 DBpedia-Live 实例后面的 Virtuoso 实例。

查询:

PREFIX : <http://dbpedia.org/resource/>
SELECT DISTINCT ?s ?p ?o WHERE {
       {
           ?s ?p ?o
           FILTER (?s=:Grimaldi_\(crater\))

       }
    }

实时 DBpedia-Snapshot SPARQL 查询定义: Link

Live DBpedia-Live SPARQL 查询定义: Link

另一个基于 url 中逗号 (,) 的示例。请注意,原始查询已更改为添加反斜杠 (\) 以使其正常工作。

查询:

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}}
  }

实时 SPARQL 查询定义: Link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    相关资源
    最近更新 更多