【问题标题】:Sparql query times out with a transitive temp memory error messageSparql 查询超时并出现传递临时内存错误消息
【发布时间】:2025-12-13 19:35:01
【问题描述】:

我正在运行以下查询以获取意大利的旅游景点

select distinct ?poi where {?company a dbpedia-owl:Place ; rdfs:label ?poiName; dcterms:subject/skos:broader* category:Visitor_attractions_in_Italy } 

但我收到以下错误。

Virtuoso 42000 Error TN...: Exceeded 1000000000 bytes in transitive temp memory. use t_distinct, t_max or more T_MAX_memory options to limit the search or increase the pool SPARQL query: define sql:big-data-const 0 #output-format:application/sparql-results+json define input:default-graph-uri PREFIX owl: PREFIX xsd: PREFIX rdfs: PREFIX rdf: PREFIX foaf: PREFIX dc: PREFIX : PREFIX dbpedia2: PREFIX dbpedia: PREFIX skos: select distinct ?poi where {?company a dbpedia-owl:Place ; rdfs:label ?poiName; dcterms:subject/skos:broader* category:Visitor_attractions_in_Italy }

即使我在查询结束时使用限制 10,我也会收到此错误。我知道这可能是一个耗时的查询,但不知道如何分解这个查询,以便最后我得到所有的旅游景点。

【问题讨论】:

标签: rdf sparql semantic-web dbpedia


【解决方案1】:

有人遇到了同样类型的问题,并在 answers.semanticweb.com 上询问:Finding all possible categories between one given and Main classification with DBpedia and SPARQL。有点不满意的答案在这里也有答案:决定你实际需要走多远,而不是使用 *,使用 {} 符号来指示 skos:broader 的最大重复次数。例如,

select distinct ?poi where {
  ?poi a dbpedia-owl:Place ;
       dcterms:subject/skos:broader{,10} category:Visitor_attractions_in_Italy
} 

SPARQL results

表示重复次数的 {} 符号实际上不是标准的一部分,尽管它在早期的草案中。不过,基于 Virtuoso 的 DBpedia 端点仍然支持它。

【讨论】:

  • 所以总的来说,这是一个反复试验的过程,看看我们能走多远?
  • 另外,我不确定这是否是由传递循环或太多子类别导致服务器无法遍历。
  • 这不应该是传递循环的问题,因为 SPARQL 语义应该处理这个问题。否则,像x p y . y p x. 这样的数据应该会导致像?a p* ?b 这样的查询出现问题。不过,*上有 很多 个类别,因此遍历图表可能需要相当多的内存。
  • @JoshuaTaylor 这不仅仅是类别的数量,还有它们的结构。您是否已经猜到 Category:United States (间接)在 Category:Theocracies 之下?
  • @svick 0) skos:broader 不是类型层次结构;是为了安排话题。 1)skos:broader isn't transitive,所以仅仅因为Cat:US skos:broader* Cat:Theocracies 并不意味着Cat:US skos:broader Cat:Theocracies。那么,可能会有一些遥远的联系,这并不奇怪。