如何转义SPARQL前缀名称中的特殊字符?

问题描述 投票:1回答:2

我正在使用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 : <http://dbpedia.org/resource/>\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
2个回答
2
投票

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 : <http://dbpedia.org/resource/>,或更常见的dbr:Grimaldi_\(crater\)PREFIX dbr: <http://dbpedia.org/resource/>)有一个漏洞。请将您的声音添加到the github issue,以帮助提高其优先级。

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


1
投票

我们已经解决了这个问题(特定于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

实时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

© www.soinside.com 2019 - 2024. All rights reserved.