rdf4j 构造查询失败
rdf4j construct query fails
我正在尝试使用以下代码片段对维基数据执行构造查询:
construct = "CONSTRUCT { " +
" ?s <http://schema.org/about> ?wikipedia ." +
"} where { " +
" OPTIONAL{ " +
" ?wikipedia <http://schema.org/about> ?s ; <http://schema.org/inLanguage> ?language ; <http://schema.org/isPartOf> <https://en.wikipedia.org/> . " +
" } "+
" ?s ?p1 <http://www.wikidata.org/entity/Q12136> . " +
"}";
repo = new SPARQLRepository("https://query.wikidata.org/sparql");
repositoryConnection = repo.getConnection();
query = repositoryConnection.prepareGraphQuery(construct);
rs = query.evaluate();
while (rs.hasNext()) {
Statement statement = rs.next();
}
不幸的是,这会导致解析错误:
WARN org.eclipse.rdf4j.rio.helpers.ParseErrorLogger - [Rio error] IRI included an unencoded space: '32' (7730, -1)
org.eclipse.rdf4j.query.QueryEvaluationException: org.eclipse.rdf4j.query.QueryEvaluationException: org.eclipse.rdf4j.rio.RDFParseException: IRI included an unencoded space: '32' [line 7730]
at org.eclipse.rdf4j.query.impl.QueueCursor.convert(QueueCursor.java:58)
at org.eclipse.rdf4j.query.impl.QueueCursor.convert(QueueCursor.java:22)
at org.eclipse.rdf4j.common.iteration.QueueIteration.checkException(QueueIteration.java:165)
at org.eclipse.rdf4j.common.iteration.QueueIteration.getNextElement(QueueIteration.java:134)
at org.eclipse.rdf4j.common.iteration.LookAheadIteration.lookAhead(LookAheadIteration.java:81)
at org.eclipse.rdf4j.common.iteration.LookAheadIteration.hasNext(LookAheadIteration.java:49)
at org.eclipse.rdf4j.common.iteration.IterationWrapper.hasNext(IterationWrapper.java:63)
at eu.qanswer.mapping.mappings.informa.Refactor.main(Refactor.java:227)
据我所知,在维基数据中有一些 uri 编码不正确,即 space 在那里。所以 rdf4j 解析器会报错。有没有办法以不太严格的方式配置解析器?
谢谢
D063520
如您所见,这里的问题是您的查询在服务器端超时。您从 RDF4J 获得的错误消息令人困惑,但原因是服务器端点没有正确传达存在问题:它只是创建了一个 200 HTTP 响应(因此 RDF4J 认为一切正常并开始处理响应主体)。中途服务器突然抛出一个错误到响应体中,然后使得RDF4J解析器抛出这个错误。
我正在尝试使用以下代码片段对维基数据执行构造查询:
construct = "CONSTRUCT { " +
" ?s <http://schema.org/about> ?wikipedia ." +
"} where { " +
" OPTIONAL{ " +
" ?wikipedia <http://schema.org/about> ?s ; <http://schema.org/inLanguage> ?language ; <http://schema.org/isPartOf> <https://en.wikipedia.org/> . " +
" } "+
" ?s ?p1 <http://www.wikidata.org/entity/Q12136> . " +
"}";
repo = new SPARQLRepository("https://query.wikidata.org/sparql");
repositoryConnection = repo.getConnection();
query = repositoryConnection.prepareGraphQuery(construct);
rs = query.evaluate();
while (rs.hasNext()) {
Statement statement = rs.next();
}
不幸的是,这会导致解析错误:
WARN org.eclipse.rdf4j.rio.helpers.ParseErrorLogger - [Rio error] IRI included an unencoded space: '32' (7730, -1)
org.eclipse.rdf4j.query.QueryEvaluationException: org.eclipse.rdf4j.query.QueryEvaluationException: org.eclipse.rdf4j.rio.RDFParseException: IRI included an unencoded space: '32' [line 7730]
at org.eclipse.rdf4j.query.impl.QueueCursor.convert(QueueCursor.java:58)
at org.eclipse.rdf4j.query.impl.QueueCursor.convert(QueueCursor.java:22)
at org.eclipse.rdf4j.common.iteration.QueueIteration.checkException(QueueIteration.java:165)
at org.eclipse.rdf4j.common.iteration.QueueIteration.getNextElement(QueueIteration.java:134)
at org.eclipse.rdf4j.common.iteration.LookAheadIteration.lookAhead(LookAheadIteration.java:81)
at org.eclipse.rdf4j.common.iteration.LookAheadIteration.hasNext(LookAheadIteration.java:49)
at org.eclipse.rdf4j.common.iteration.IterationWrapper.hasNext(IterationWrapper.java:63)
at eu.qanswer.mapping.mappings.informa.Refactor.main(Refactor.java:227)
据我所知,在维基数据中有一些 uri 编码不正确,即 space 在那里。所以 rdf4j 解析器会报错。有没有办法以不太严格的方式配置解析器?
谢谢 D063520
如您所见,这里的问题是您的查询在服务器端超时。您从 RDF4J 获得的错误消息令人困惑,但原因是服务器端点没有正确传达存在问题:它只是创建了一个 200 HTTP 响应(因此 RDF4J 认为一切正常并开始处理响应主体)。中途服务器突然抛出一个错误到响应体中,然后使得RDF4J解析器抛出这个错误。