我想从DBpedia获得所有数学家,所以我为DBpedia's SPARQL service编写了这个查询:
SELECT DISTINCT ?person
{
?person dct:subject ?category.
?category skos:broader* dbc:Mathematicians.
}
问题在于类别Mathematicians
受到污染,因为dbc:Euclid等类别会包含所有欧几里得几何体。我相信这些类别导致查询失败:
Virtuoso 42000错误TN ...:传递临时存储器中超过1000000000字节。使用t_distinct,t_max或更多T_MAX_memory选项来限制搜索或增加池
许多有问题的类别都在dbc:Wikipedia_categories_named_after_mathematicians。
有没有办法忽略skos:broader*
路径中会导致错误消失的这些类别?
答案 0 :(得分:0)
您可以通过过滤它们来列出您不想要包含的类别:
SELECT DISTINCT ?person
{
?person dct:subject ?category.
?category skos:broader* dbc:Mathematicians.
FILTER (?category NOT IN (dbc:Euclid))
}
但是这不会消除错误,因为Virtuoso仍然需要遍历skos:broader
层次结构,耗尽传递堆内存'。其他方法包括选择特定类别或遍历部分层次结构。
特定类别可以使用UNION
语句,但VALUES
快捷方式是一种更简单的语法:
SELECT DISTINCT ?person
{
VALUES ?category {dbc:Mathematicians dbc:Mental_calculators dbc:Lists_of_mathematicians}
?person dct:subject ?category.
}
要查询部分层次结构,可以使用一些属性路径表达式。这个将得到父母和祖父母:
SELECT DISTINCT ?person
{
?person dct:subject ?category.
?category skos:broader | (skos:broader/skos:broader) dbc:Mathematicians.
# filter as desired - FILTER (?category NOT IN (dbc:Euclid))
}