我尝试按DBpedia中的数据类型进行过滤。例如:
SELECT *
WHERE {?s ?p ?o .
FILTER ( datatype(?o) = xsd:integer)
}
LIMIT 10
但我没有得到任何结果,而肯定有整数值。我使用Virtuoso从其他端点获得相同的结果,但我确实从其他端点获得了结果。可能是什么问题呢?如果Virtuoso没有正确实现这个SPARQL函数,那么使用什么呢?
答案 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查询以实现更高的互操作性是一种很好的做法。