从 DBPedia 解析数据时出现 OpenRdf 异常

OpenRdf Exception when parsing data from DBPedia

我将 OpenRdf 与 Sparql 结合使用从 DBPedia 收集数据,但我在针对 DBPedia Sparql 端点的以下查询 运行 中遇到了一些错误:

CONSTRUCT{ 
    ?battle ?relation ?data . 
} 
WHERE{
  ?battle   rdf:type    yago:Battle100953559 ;  
            ?relation   ?data   .  
  FILTER(?relation != owl:sameAs)
}
LIMIT 1 
OFFSET 18177

我修改了LIMIT和OFFSET来指出引发问题的具体结果

回复是这个:

@prefix foaf:   <http://xmlns.com/foaf/0.1/> .
@prefix ns1:    <http://en.wikipedia.org/wiki/> .
<http://dbpedia.org/resource/Mongol%E2%80%93Jin_Dynasty_War>    foaf:isPrimaryTopicOf   ns1:Mongol–Jin_Dynasty_War .

问题是 ns1:Mongol–Jin_Dynasty_War 实体包含一个减号,因此当 运行 这个查询在里面时,我得到以下异常Java 使用 OpenRdf 的应用程序:

org.openrdf.query.QueryEvaluationException: org.openrdf.rio.RDFParseException: Expected '.', found '–' [line 3]

有什么办法可以避免这个问题吗?

谢谢!

为了帮助可能遇到相同问题的其他用户,我将在此处post介绍使用 OpenRDF v2.7.x.[=14= 设置图形查询首选输出格式的方法。 ]

您需要创建 SPARQLRepository 的子class 才能访问 HTTPClient(由于某些原因,该字段为 protected.

public class NtripleSPARQLRepository extends SPARQLRepository {
    public NtripleSPARQLRepository(String endpointUrl) {
        super(endpointUrl);
        this.getHTTPClient().setPreferredRDFFormat(RDFFormat.NTRIPLES);
    }
}

您只需要为此 class 创建一个新实例:

NtripleSPARQLRepository repository = new NtripleSPARQLRepository(service);
RepositoryConnection connection = new SPARQLConnection(repository);
Query query = connection.prepareQuery(QueryLanguage.SPARQL, "YOUR_QUERY");

如果您正在查询 Virtuoso 服务器,那么您可能在 Virtuoso 的实现中遇到了马虎。我在获得 XML 结果(输出中的垂直制表符,但仅 XML 1.0)和最近的 JSON 结果(不在基本多语言平面中的字符的 \U 转义)时看到了这一点。