繁体   English   中英

通过 Jena 的 Java API 对 Jena TDB 查询执行 SPARQL 时出现非法转义序列值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM