【问题标题】:Discovering the version of a SPARQL endpoint发现 SPARQL 端点的版本
【发布时间】:2015-04-21 10:30:02
【问题描述】:
给定一个 SPARQL 端点(可以是 SPARQL 1.0 或 1.1),例如 http://pt.dbpedia.org/sparql,我如何找到它支持的 SPARQL 版本?
[一个选择是尝试 1.1 功能,例如 aggregate functions 并查看它是否有效,但我想应该有更好的方法来做到这一点]。
SPARQL 1.1 服务描述规范says
通过 SPARQL 协议提供的 SPARQL 服务应该返回一个
取消引用时服务端点处的服务描述文档
使用不带任何查询参数字符串的 HTTP GET 操作
假如。此服务描述必须在 RDF 中提供
序列化,可以通过 RDFa [RDFA] 嵌入到 (X)HTML 中,并且
如果在其他 RDF 中可用,则应使用内容协商 [CONNEG]
表示
还有,
3.2.10 sd:supportedLanguage
将 sd:Service 的实例与它实现的 SPARQL 语言(例如查询和更新)相关联。
subPropertyOf: sd:feature domain: sd:Service range: sd:Language
3.3.3 sd:语言
sd:Language 的一个实例代表一种 SPARQL 语言,包括提供的特定配置
特定的功能或扩展。该文件定义了三个
sd:Language 的实例:sd:SPARQL10Query、sd:SPARQL11Query 和
sd:SPARQL11更新。类型:rdfs:Class subClassOf: sd:Feature
但是当我取消引用大多数 SPARQL 端点时,它们只会向我发送一个 HTML SPARQL 查询编辑器。
更新:
HTML 编辑器问题是因为我没有在端点上使用正确的内容协商。但现在的问题是,是否有一种好方法可以区分 SPARQL 1.0 端点和不提供服务描述的 SPARQL 1.1 端点?
在发现和监控 SPARQL 端点(例如 SPARQL Web-Querying Infrastructure: Ready for Action?、Discoverability of SPARQL Endpoints in Linked Open Data)方面已经完成了一些工作,但我没有看到找到版本的直接方法。
【问题讨论】:
标签:
service
version
sparql
linked-data
discoverability
【解决方案1】:
您应该检查的第一件事是,当您取消引用端点时,您请求的是 RDF 格式的内容,而不是 web 浏览器默认指定的 text/html 等内容,并且端点没有根据用户代理等为您提供某些输出。例如,如果您访问http://dbpedia.org/sparql 的 DBpedia 端点,您将获得一个 HTML 查询编辑器。但是,如果您请求该页面时将 Accept 标头设置为“application/rdf+xml”,您将获得服务描述。在不知道您遇到问题的端点的情况下,我们真的无法提供更多帮助。这应该工作,但某些端点不这样做,这不是我们可以调试的真正技术问题,特别是如果您不告诉我们您遇到问题的端点。这是使用 curl 的样子:
$ curl -H "Accept: application/rdf+xml" http://dbpedia.org/sparql
<?xml version="1.0" encoding="utf-8" ?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:sd="http://www.w3.org/ns/sparql-service-description#" >
<rdf:Description rdf:about="http://dbpedia.org/sparql">
<rdf:type rdf:resource="http://www.w3.org/ns/sparql-service-description#Service" />
<sd:endpoint rdf:resource="http://dbpedia.org/sparql" />
<sd:feature rdf:resource="http://www.w3.org/ns/sparql-service-description#UnionDefaultGraph" />
<sd:feature rdf:resource="http://www.w3.org/ns/sparql-service-description#DereferencesURIs" />
<sd:resultFormat rdf:resource="http://www.w3.org/ns/formats/SPARQL_Results_JSON" />
<sd:resultFormat rdf:resource="http://www.w3.org/ns/formats/SPARQL_Results_XML" />
<sd:resultFormat rdf:resource="http://www.w3.org/ns/formats/Turtle" />
<sd:resultFormat rdf:resource="http://www.w3.org/ns/formats/N-Triples" />
<sd:resultFormat rdf:resource="http://www.w3.org/ns/formats/N3" />
<sd:resultFormat rdf:resource="http://www.w3.org/ns/formats/RDF_XML" />
<sd:resultFormat rdf:resource="http://www.w3.org/ns/formats/SPARQL_Results_CSV" />
<sd:resultFormat rdf:resource="http://www.w3.org/ns/formats/RDFa" />
<sd:supportedLanguage rdf:resource="http://www.w3.org/ns/sparql-service-description#SPARQL10Query" />
<sd:url rdf:resource="http://dbpedia.org/sparql" />
</rdf:Description>
这是一个使用 d3 的 XmlHttpRequest 功能的实时版本。 (我知道你可以在没有库的情况下做到这一点,但我最近一直在使用很多 d3。)
/**
* Make a GET request to dbpedia.org/sparql
* and show the response in a PRE element.
*/
d3.xhr("http://dbpedia.org/sparql")
.get(function(error,data) {
console.log(error);
console.log(data);
d3.select("body")
.append("pre")
.text(data.response);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
【讨论】:
-
谢谢!是的,它解决了我关于在没有内容协商的情况下向 SPARQL 端点发送请求的评论。此外,如果 SPARQL 端点向我发送服务描述,即使没有 sd:Language 信息,我也可以推断它可能支持 SPARQL 1.1,因为服务描述是在 1.1 中引入的。但是如果没有服务描述,有没有办法知道一个特定的端点是否是 SPARQL 1.0 的呢?我关心的端点是pt.dbpedia.org/sparql。
-
@Nandana 是的,该端点似乎没有返回适当的 RDF 描述。我不确定 SPARQL 1.0 有什么可用的。我认为SPARQL protocol for RDF(对于 SPARQL 1.0)可能是你得到的最接近的东西。