如何转义 SPARQL 前缀名称中的特殊字符?
How to escape special characters in SPARQL Prefixed Names?
我正在使用 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"
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,以帮助提高其优先级。
前缀名称中的反斜杠转义现在可以在支持 DBpedia 实例的 Virtuoso 7(07.20.3230,截至 commit 5f68a2e2f2, 2019-04-01)中正常工作。
我们已经解决了这个问题(特定于 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\))
}
}
Live 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
我正在使用 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"
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,以帮助提高其优先级。
前缀名称中的反斜杠转义现在可以在支持 DBpedia 实例的 Virtuoso 7(07.20.3230,截至 commit 5f68a2e2f2, 2019-04-01)中正常工作。
我们已经解决了这个问题(特定于 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\))
}
}
Live 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