按数据类型过滤

时间:2016-06-22 19:06:44

标签: sparql dbpedia virtuoso

我尝试按DBpedia中的数据类型进行过滤。例如:

SELECT *
WHERE {?s ?p ?o .
    FILTER ( datatype(?o) = xsd:integer) 
    } 
LIMIT 10

但我没有得到任何结果,而肯定有整数值。我使用Virtuoso从其他端点获得相同的结果,但我确实从其他端点获得了结果。可能是什么问题呢?如果Virtuoso没有正确实现这个SPARQL函数,那么使用什么呢?

1 个答案:

答案 0 :(得分:4)

这是一个昂贵的查询,因为它必须遍历所有三元组(?s ?p ?o .)。查询的执行时间超过了为Virtuoso的DBpedia SPARQL端点提供服务的http://dbpedia.org/sparql实例配置的最长时间。

如果您不使用timeout参数,则会出现超时错误(Virtuoso S1T00 Error SR171: Transaction timed out)。当您使用timeout(默认情况下为DBpedia端点设置为30000)时,您将获得包含HTTP标头的不完整结果:

X-SQL-State: S1TAT
X-SQL-Message: RC...: Returning incomplete results, query interrupted by result timeout.  Activity:  1.389M rnd  5.146M seq      0 same seg   55.39K same pg    195 same par      0 disk      0 spec disk      0B /      0 me

因此空结果可能不完整,并且不需要指出DBpedia中没有xsd:integer文字。有关Virtuoso部分结果的相关讨论可以在here找到。

作为查询的解决方案,您可以从dumps加载DBpedia并在本地进行分析。

作为旁注,您的查询在语法上是无效的,因为它缺少xsd前缀的命名空间。您可以通过SPARQLer Query Validator检查SPARQL查询的语法。您可以使用Prefix.cc找到公共前缀的名称空间。提供DBpedia SPARQL端点的Virtuoso忽略了xsd前缀缺少的命名空间,但坚持使用语法上有效的SPARQL查询以实现更高的互操作性是一种很好的做法。