[英]Illegal escape sequence value when executing a SPARQL against Jena TDB query via Jena's Java API
我正在对 Jena 的 TDB 运行 SPARQL* 查询,其中结果集(DBPedia 日志)包含转义字符。 要运行查询,我使用 org.apache.jena.query.QueryExecution,如下所示:
query = "SELECT *
WHERE
{ << ?s <http://dbpedia.org/property/cover> ?o >>
vers:valid_from ?valid_from ;
vers:valid_until ?valid_until
BIND("2022-01-05T21:42:11.803+02:00"^^xsd:dateTime AS ?TimeOfExecution)
FILTER ( ( ?valid_from <= ?TimeOfExecution ) && ( ?TimeOfExecution < ?valid_until ) )
}"
conn = RDFConnection.connect(String.format("http://localhost:%d/in_memory_server/sparql", server.getHttpPort()));
QueryExecution qExec = conn.query(query);
我得到以下异常:
Exception in thread "main" org.apache.jena.atlas.json.JsonParseException: illegal escape sequence value: f (0x66)
at org.apache.jena.atlas.json.io.parser.TokenizerJSON.exception(TokenizerJSON.java:757)
at org.apache.jena.atlas.json.io.parser.TokenizerJSON.exception(TokenizerJSON.java:749)
at org.apache.jena.atlas.json.io.parser.TokenizerJSON.readLiteralEscape(TokenizerJSON.java:669)
at org.apache.jena.atlas.json.io.parser.TokenizerJSON.allBetween(TokenizerJSON.java:559)
at org.apache.jena.atlas.json.io.parser.TokenizerJSON.parseToken(TokenizerJSON.java:138)
at org.apache.jena.atlas.json.io.parser.TokenizerJSON.hasNext(TokenizerJSON.java:75)
at org.apache.jena.atlas.iterator.PeekIterator.fill(PeekIterator.java:50)
at org.apache.jena.atlas.iterator.PeekIterator.next(PeekIterator.java:92)
at org.apache.jena.atlas.json.io.parser.JSONParserBase.nextToken(JSONParserBase.java:102)
at org.apache.jena.atlas.json.io.parser.JSONP.parseObject(JSONP.java:75)
at org.apache.jena.atlas.json.io.parser.JSONP.parseAny(JSONP.java:97)
at org.apache.jena.atlas.json.io.parser.JSONP.parseObject(JSONP.java:79)
at org.apache.jena.atlas.json.io.parser.JSONP.parseAny(JSONP.java:97)
at org.apache.jena.atlas.json.io.parser.JSONP.parseArray(JSONP.java:143)
at org.apache.jena.atlas.json.io.parser.JSONP.parseAny(JSONP.java:98)
at org.apache.jena.atlas.json.io.parser.JSONP.parseObject(JSONP.java:79)
at org.apache.jena.atlas.json.io.parser.JSONP.parseAny(JSONP.java:97)
at org.apache.jena.atlas.json.io.parser.JSONP.parseObject(JSONP.java:79)
at org.apache.jena.atlas.json.io.parser.JSONP.parse(JSONP.java:50)
at org.apache.jena.atlas.json.io.parser.JSONParser.parse(JSONParser.java:58)
at org.apache.jena.atlas.json.io.parser.JSONParser.parse(JSONParser.java:40)
at org.apache.jena.atlas.json.JSON._parse(JSON.java:126)
at org.apache.jena.atlas.json.JSON.parse(JSON.java:38)
at org.apache.jena.riot.resultset.rw.ResultSetReaderJSON$RS_JSON.parse(ResultSetReaderJSON.java:103)
at org.apache.jena.riot.resultset.rw.ResultSetReaderJSON.process(ResultSetReaderJSON.java:74)
at org.apache.jena.riot.resultset.rw.ResultSetReaderJSON.readAny(ResultSetReaderJSON.java:67)
at org.apache.jena.riot.resultset.rw.ResultsReader.readAny(ResultsReader.java:167)
at org.apache.jena.riot.resultset.rw.ResultsReader.readAny(ResultsReader.java:152)
at org.apache.jena.riot.ResultSetMgr.readAny(ResultSetMgr.java:191)
at org.apache.jena.riot.ResultSetMgr.read(ResultSetMgr.java:113)
at org.apache.jena.sparql.exec.http.QueryExecHTTP.execRowSet(QueryExecHTTP.java:195)
at org.apache.jena.sparql.exec.http.QueryExecHTTP.select(QueryExecHTTP.java:156)
at org.apache.jena.sparql.exec.QueryExecutionAdapter.execSelect(QueryExecutionAdapter.java:117)
at org.apache.jena.sparql.exec.QueryExecutionCompat.execSelect(QueryExecutionCompat.java:97)
at org.ai.wu.ac.at.tdbArchive.core.JenaTDBArchive_TB_star_f.materializeQuery(JenaTDBArchive_TB_star_f.java:295)
at org.ai.wu.ac.at.tdbArchive.core.JenaTDBArchive_TB_star_f.bulkAllMatQuerying(JenaTDBArchive_TB_star_f.java:258)
at org.ai.wu.ac.at.tdbArchive.tools.JenaTDBArchive_query.main(JenaTDBArchive_query.java:266)
一行的?o 包含以下有问题的字符串:
"{\
tf1\ansi\ansicpg1252{\onttbl}
{\colortbl;\
ed255\green255\lue255;"@en
是否可以设置任何属性来规避这些转义字符或告诉 Jena 或 ARQ 使用不同的解析器?
由于某种原因,当它是 SPARQL 而不是 SPARQL* 查询时,我没有这个问题。 这能有所作为吗? 例如,当我运行以下 SPARQL 查询时,它提供完全相同的结果,仅来自 a.ng RDF 数据集(四边形),我没有例外:
Select * WHERE
{ GRAPH <http://example.org/versions>
{ ?graph <http://www.w3.org/2002/07/owl#versionInfo> 92 }
GRAPH ?graph
{ ?s <http://dbpedia.org/property/cover> ?o }
}
更新 1:问题在于序列化为 .ttl 的 RDF 数据集。 为了创建 RDF 数据集,我使用 python。 该脚本将初始快照和变更集作为输入,并构建一个包含所有变更/版本的新 RDF 数据集。 我使用以下代码片段来解析和序列化变更集:
从 rdflib 导入图
cs_add = Graph() cs_add.parse("path_to_changeset")
问题似乎出在解析器中。 被解析的字符串是:
"{\\rtf1\\ansi\\ansicpg1252{\\fonttbl}\n{\\colortbl;\\red255\\green255\\blue255;"@en
现在我想按原样序列化这个字符串。 我想保留所有特殊字符,它们不应该被转义。 这就是我遍历三元组并打印 object 文字时得到的结果:
for s, p, o in cs_add:
if "ansicpg1252" in o: # just to catch the string
print(o.encode('utf-8'))
print()
print(o.n3())
Output
b'{\\\rtf1\\ansi\\ansicpg1252{\\\x0conttbl}\n{\\colortbl;\\\red255\\green255\\\x08lue255;'
"""{\\\rtf1\\ansi\\ansicpg1252{\\onttbl}
{\\colortbl;\\\red255\\green255\lue255;"""@en
所以我们看到例如添加了第三个反斜杠。 现在我需要找到一种以某种方式保留字符串原样的编码。
该问题似乎与 Java Jena API 无关,而是与 python 的 rdflib 有关。 我将提出另一个关于 rdflib 的具体问题的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.