2016-07-12 6 views
0

Я хочу, чтобы все математиков из 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

Я предполагаю, что проблема здесь состоит в том, что категория иерархия DBpedia которая основана на категориях Википедии может содержать циклы, то есть, что может быть причиной ошибки - хотя это не должно действительно, действительно. – AKSW

ответ

0

Вы можете перечислить категории, которые вы не хотите включать путем фильтрации их:

SELECT DISTINCT ?person 
{ 
    ?person dct:subject ?category. 
    ?category skos:broader* dbc:Mathematicians. 
    FILTER (?category NOT IN (dbc:Euclid)) 
} 

Но это не будет устранить ошибку, потому что Виртуоз еще нужно пересечь 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)) 
}