如何从Java访问Wikidata SPARQL接口?

安德烈亚斯·哈特曼(Andreas Hartmann)

我正在尝试从Wikidata查询实体的所有实例。我发现,目前唯一的方法是使用SPARQL端点。

我找到了一个查询示例,它查询了我想做什么,并从Web界面成功执行了该查询。不幸的是,我似乎无法从Java代码中执行它。我正在使用openRDF SPARQL库。这是我的相关代码:

SPARQLRepository sparqlRepository = new SPARQLRepository(
        "https://query.wikidata.org/");
SPARQLConnection sparqlConnection = new SPARQLConnection(
        sparqlRepository);

String query = "SELECT ?s ?desc ?authorlabel (COUNT(DISTINCT ?sitelink) as ?linkcount) WHERE {"
        + "?s wdt:P31 wd:Q571 ."
        + "?sitelink schema:about ?s ."
        + "?s wdt:P50 ?author"
        + "OPTIONAL { ?s rdfs:label ?desc filter (lang(?desc) = \"en\"). }"
        + "OPTIONAL {"
        + "?author rdfs:label ?authorlabel filter (lang(?authorlabel) = \"en\")."
        + "}"
        + "} GROUP BY ?s ?desc ?authorlabel ORDER BY DESC(?linkcount)";

TupleQuery tupleQuery = sparqlConnection.prepareTupleQuery(
        QueryLanguage.SPARQL, query);
System.out.println("Result for tupleQuery" + tupleQuery.evaluate());

这是我收到的回复:

Exception in thread "main" org.openrdf.query.QueryEvaluationException: <html>
<head><title>405 Not Allowed</title></head>
<body bgcolor="white">
<center><h1>405 Not Allowed</h1></center>
<hr><center>nginx/1.9.4</center>
</body>
</html>
    at org.openrdf.repository.sparql.query.SPARQLTupleQuery.evaluate(SPARQLTupleQuery.java:59)
    at main.Test.main(Test.java:72)
Caused by: org.openrdf.repository.RepositoryException: <html>
<head><title>405 Not Allowed</title></head>
<body bgcolor="white">
<center><h1>405 Not Allowed</h1></center>
<hr><center>nginx/1.9.4</center>
</body>
</html>
    at org.openrdf.http.client.HTTPClient.handleHTTPError(HTTPClient.java:953)
    at org.openrdf.http.client.HTTPClient.sendTupleQueryViaHttp(HTTPClient.java:718)
    at org.openrdf.http.client.HTTPClient.getBackgroundTupleQueryResult(HTTPClient.java:602)
    at org.openrdf.http.client.HTTPClient.sendTupleQuery(HTTPClient.java:367)
    at org.openrdf.repository.sparql.query.SPARQLTupleQuery.evaluate(SPARQLTupleQuery.java:52)
    ... 1 more

通常,我认为这意味着我需要各种API密钥,但是Wikidata API似乎是完全开放的。建立连接时是否出错?

简·布罗克斯特拉(Jen Broekstra)

Wikidata的正确端点URL是https://query.wikidata.org/sparql-您遗漏了最后一点。

另外,我注意到您的代码中有一些小故障。首先,您正在执行以下操作:

SPARQLConnection sparqlConnection = new SPARQLConnection(sparqlRepository);

应该是这样的:

RepositoryConnection sparqlConnection = sparqlRepository.getConnection();

始终Repository使用来对象检索连接对象getConnection()-这意味着资源是共享的,并且在Repository必要时可以关闭“悬空”的连接。

其次:您不能打印出这样的查询结果:

System.out.println("Result for tupleQuery" + tupleQuery.evaluate());

如果您希望将结果打印出来,System.out则应执行以下操作:

tupleQuery.evaluate(new SPARQLResultsTSVWriter(System.out));

或者(如果您想对结果进行更多自定义):

for (BindingSet bs : QueryResults.asList(tupleQuery.evaluate())) {
    System.out.println(bs);
}

就其价值而言-通过上述更改,查询请求将运行,但对于Wikidata而言,您的查询似乎“过分繁琐”-至少我从服务器收到超时错误。但是,尝试使用更简单的查询,您将看到代码的工作原理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Wikidata SPARQL:如何包含分组属性的标签

来自分类Dev

Wikidata Sparql:如何从个人获取奖励时间和工作

来自分类Dev

Apache Fuseki:仅公开SPARQL端点接口

来自分类Dev

Wikidata Sparql:如何获取某个演员从未导演过的演员名单?

来自分类Dev

SPARQL WikiData。如何只选择维基百科数据库并避免注释重复?

来自分类Dev

Wikidata Sparql:如何获取某个演员从未导演过的演员名单?

来自分类Dev

sparql wikidata标识符参考

来自分类Dev

Wikidata SPARQL:获取子类但还返回父类

来自分类Dev

Java接口如何使用?

来自分类常见问题

无法从Java类访问Kotlin接口

来自分类Dev

通过Java接口远程访问ArangoDB

来自分类Dev

限制对Java中类的接口的访问

来自分类Dev

限制对Java中类的接口的访问

来自分类Dev

通过Java接口远程访问ArangoDB

来自分类Dev

通用方法:限制接口,如何访问属性

来自分类Dev

如何使用即兴接口访问代理对象

来自分类Dev

如何获得对Linux接口的远程访问

来自分类Dev

如何使用即兴接口访问代理对象

来自分类Dev

访问接口 ByRef 时如何避免警告

来自分类Dev

如何在 Wikidata 上创建 SPARQL 查询以获取所有具有 Project Gutenberg 电子书 ID 的书籍?

来自分类Dev

rdfs:label 在 SPARQL 中不匹配。公共接口和 SPARQL 数据集之间的分歧

来自分类Dev

sparql如何计算变量对

来自分类Dev

sparql如何计算变量对

来自分类Dev

Java接口扩展接口的优化

来自分类Dev

Java中的接口与什么接口?

来自分类Dev

Java中的接口如何工作?

来自分类Dev

JVM如何管理Java接口?

来自分类Dev

如何使用这样的Java接口?

来自分类Dev

访问接口内的枚举

Related 相关文章

热门标签

归档