如何从路径中排除节点?

时间:2016-07-12 15:46:54

标签: sparql dbpedia virtuoso

我想从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*路径中会导致错误消失的这些类别?

1 个答案:

答案 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)) 
}