2016-10-25 2 views
1

Я использую GraphDB Free 7.1, и я создал репозиторий с настройками по умолчанию. Я загрузил файл ttl с 2,7 миллионами триплетов. Я пытаюсь создать запрос (не очень сложный, но довольно сложный), который должен вернуть 200k ответы и Workbench отображает только 1k ответы и журнал GraphDB отображает исключениеОценка запроса заняла слишком много времени

10:52:19.580 [repositories/PaaSport] INFO c.o.f.sesame.RepositoryController - POST query -1325396809 
10:52:29.594 [repositories/PaaSport] ERROR o.o.h.s.r.TupleQueryResultView - Query interrupted 
org.openrdf.query.QueryInterruptedException: Query evaluation took too long 
... 
10:52:29.594 [repositories/PaaSport] INFO o.o.h.s.r.TupleQueryResultView - Request for query -1325396809 is finished 

Запрос я использую:

SELECT DISTINCT ?offering ?Value 
WHERE { 
    ?offering   a       paasport:Offering ; 
         DUL:satisfies    ?groundDescription . 
    ?groundDescription paasport:offers   ?characteristic . 
    ?characteristic  a       paasport:Storage ; 
         DUL:hasParameter   ?par . 
    ?par    a       paasport:StorageCapacity ; 
         DUL:hasParameterDataValue ?Value ; 
         DUL:parametrizes   ?qualityValue . 
    ?qualityValue  uomvocab:measuredIn  ?Units . 
    ?Units    a       ?AppParMeasureUnitType . 
    ucum:GB    a       ?AppParMeasureUnitType . 
    ?Units    a       uomvocab:SimpleDerivedUnit . 
    ucum:GB    a       uomvocab:SimpleDerivedUnit . 
    ucum:GB    uomvocab:derivesFrom  ?BasicUnit . 
    ?Units    uomvocab:derivesFrom  ?BasicUnit . 
    ucum:GB    uomvocab:modifierPrefix ?prefix1 . 
    ?Units    uomvocab:modifierPrefix ?prefix2 . 
    ?prefix1   uomvocab:factor   ?Factor1 . 
    ?prefix2   uomvocab:factor   ?Factor2 . 
     FILTER(xsd:double(?Factor2)*?Value = xsd:double(?Factor1)*4) 
    } 

Поскольку ожидания запроса установлен в 0, я не уверен, что вызывает исключение прерывания запроса; скорее всего, проблемы памяти? Очень простые запросы (например, возврат всех экземпляров определенного класса) работают нормально.

Есть подсказки? Любая помощь будет оценена по достоинству. Я могу предоставить более подробную информацию, если это необходимо.

Бест, Ник

+0

Похоже, что запрос слишком сложен. Вы можете поделиться запросом? Вы пытались изменить порядок некоторых частей запроса? Иногда это может помочь оптимизатору плана запросов выбрать более эффективный план выполнения. Кроме того, могут быть некоторые параметры конфигурации GraphDB, но я не эксперт в этом трехместном магазине. – AKSW

+0

'SELECT DISTINCT? Предложение? Значение WHERE { ? Предложение rdf: type paasport: Предложение. \t? Предлагая DUL: удовлетворяет? GroundDescription. \t? Ground pasasport: предлагает? Характеристика. \t? Характеристика rdf: Тип paasport: Хранение. \t? Характеристики DUL: естьParameter? Par. \t? Par rdf: type paasport: StorageCapacity. \t? Par DUL: hasParameterDataValue? Значение. \t? Par DUL: параметризирует? QualityValue. \t?qualityValue uomvocab: measuredIn? Units .' –

+0

'? Units rdf: type? AppParMeasureUnitType. \t ucum: GB rdf: type? AppParMeasureUnitType. \t? Единицы измерения rdf: Тип uomvocab: SimpleDerivedUnit. \t ucum: GB rdf: type uomvocab: SimpleDerivedUnit. \t ucum: GB uomvocab: происходит из? BasicUnit. \t? Единицы uomvocab: происходит из? BasicUnit. \t ucum: GB uomvocab: modifierPrefix? Prefix1. \t? Единицы uomvocab: modifierPrefix? Prefix2. \t? Prefix1 uomvocab: factor? Factor1. \t? Prefix2 uomvocab: factor? Factor2. \t FILTER (xsd: double (? Factor2) *? Value = xsd: double (? Factor1) * 4) } ' –

ответ

1

На самом деле мне удалось сократить запрос к минимуму, чтобы ответить. Проблема заключалась в основном за счет следующих тройных моделей:

ucum:GB rdf:type    ?AppParMeasureUnitType . 
ucum:GB rdf:type    uomvocab:SimpleDerivedUnit . 
ucum:GB uomvocab:derivesFrom ?BasicUnit . 

Если они опущены, и соответствующие переменные в исходном запросе заменяются постоянными ресурсами, то запрос ответ.

Вот результирующий запрос:

SELECT DISTINCT ?offering ?Value 
WHERE { 
    ?offering   rdf:type     paasport:Offering . 
    ?offering   DUL:satisfies    ?groundDescription . 
    ?groundDescription paasport:offers   ?characteristic . 
    ?characteristic  rdf:type     paasport:Storage . 
    ?characteristic  DUL:hasParameter   ?par . 
    ?par    rdf:type     paasport:StorageCapacity . 
    ?par    DUL:hasParameterDataValue ?Value . 
    ?par    DUL:parametrizes   ?qualityValue . 
    ?qualityValue  uomvocab:measuredIn  ?Units . 
    ?Units    rdf:type     ucum:UnitOf-infotech . 
    ?Units    rdf:type     uomvocab:SimpleDerivedUnit . 
    ?Units    uomvocab:derivesFrom  <http://purl.oclc.org/NET/muo/ucum/unit/amount-of-information/byte> . 
    ucum:GB    uomvocab:modifierPrefix ?prefix1 . 
    ?Units    uomvocab:modifierPrefix ?prefix2 . 
    ?prefix1   uomvocab:factor   ?Factor1 . 
    ?prefix2   uomvocab:factor   ?Factor2 . 
     FILTER(xsd:double(?Factor2)*?Value >= xsd:double(?Factor1)*2) 
} 
+0

Хорошо, но имеет ли этот запрос то же значение, что и исходный запрос? Я так не думаю, правильно? Но конечно, если вы знаете привязки этих переменных, вы можете уменьшить количество объединений. – AKSW

+0

Связи с переменными могут быть предварительно определены более простыми запросами SPARQL, а затем можно построить большую. Тем не менее, запрос все еще разыгрывается на следующем «уровне тестирования» в 27 миллионов троек. –

0
  1. Вам действительно нужно DISTINCT? Это всегда замедляет работу, поскольку оно должно извлекать все результаты в памяти, сортировать их и унифицировать их перед началом обслуживания.

  2. Вам нужно = или> = в ФИЛЬТРЕ? If = then замените фильтр на BIND (... как? Factor2) и поместите эти вещи перед поиском? Prefix2

  3. Профилировали ли вы запрос? http://graphdb.ontotext.com/documentation/standard/explain-plan.html