2016-09-28 2 views
3

У меня довольно сложный запрос SPARQL, который выполняется тысячи раз в параллельных потоках (400 потоков). Запрос здесь несколько упрощен (пространства имен, свойства и переменные были уменьшены) для удобства чтения, но сложность остается нетронутой (союзы, количество графиков и т. Д.). Запрос выполняется против 4 графиков, самый большой из которых содержит 5 561 181 троек.Комплексный запрос SPARQL - подсказки о производительности Virtuoso?

PREFIX graphA: <GraphABaseURI:> 

ASK 
FROM NAMED <GraphBURI> 
FROM NAMED <GraphCURI> 
FROM NAMED <GraphABaseURI> 
FROM NAMED <GraphDBaseURI> 
WHERE{ 
    { 
     GRAPH <GraphABaseURI>{ 
     ?variableA a graphA:ClassA . 
     ?variableA graphA:propertyA ?variableB . 
     ?variableB dcterms:title ?variableC . 
     ?variableA graphA:propertyB ?variableD . 
     ?variableL<GraphABaseURI:propertyB> ?variableD . 
     ?variableD <propertyBURI> ?variableE 
     } 
     . 
     GRAPH <GraphBURI>{ 
     ?variableF <propertyCURI>/<propertyDURI> ?variableG . 
     ?variableF <propertyEURI> ?variableH 
     } 
     . 
     GRAPH <GraphCURI>{ 
     ?variableI <http://www.w3.org/2004/02/skos/core#notation> ?variableJ . 
     ?variableI <http://www.w3.org/2004/02/skos/core#prefLabel> ?variableK . 
     FILTER (isLiteral(?variableK) && REGEX(?variableK, "literalA", "i")) 
     } 
     . 
     FILTER (isLiteral(?variableJ) && ?variableG = ?variableJ) . 
     FILTER (?variableE = ?variableH) 
    } 
    UNION 
    { 
     GRAPH <GraphABaseURI>{ 
      ?variableA a graphA:ClassA . 
      ?variableA graphA:propertyA ?variableB . 
      ?variableB dcterms:title ?variableC . 
      ?variableA graphA:propertyB ?variableD . 
      ?variableL<propertyBURI> ?variableE . 
      ?variableL <propertyFURI> ?variableD . 
     } 
     . 
     GRAPH <GraphDBaseURI>{ 
      ?variableM <propertyGURI> ?variableN . 
      ?variableM <propertyHURI> ?variableO . 
      FILTER (isLiteral(?variableO) && REGEX(?variableO, "literalA", "i")) 
     } 
     . 
     FILTER (?variableE = ?variableN) . 

    } 
    UNION 
    { 
     GRAPH <GraphABaseURI>{ 
      ?variableA a graphA:ClassA . 
      ?variableA graphA:propertyA ?variableB . 
      ?variableB dcterms:title ?variableC . 
      ?variableA graphA:propertyB ?variableD . 
      ?variableL<propertyBURI> ?variableE . 
      ?variableL <propertyIURI> ?variableD . 
     } 
     . 
     GRAPH <GraphDBaseURI>{ 
      ?variableM <propertyGURI> ?variableN . 
      ?variableM <propertyHURI> ?variableO . 
      FILTER (isLiteral(?variableO) && REGEX(?variableO, "literalA", "i")) 
     } 
     . 
     FILTER (?variableE = ?variableN) . 
    } 
    . FILTER (isLiteral(?variableC) && REGEX(?variableC, "literalB", "i")) . 
} 

Я бы не ожидал, что кто-то преобразует вышеуказанный запрос (конечно ...). Я просто отправляю запрос, чтобы продемонстрировать сложность и все используемые структуры SPARQL.

Мои вопросы:

  1. бы я приобретаю в отношении производительности, если у меня были все мои троек в одном графике? Таким образом, я бы избегал союзов и упрощал мой запрос, однако, это также принесет пользу с точки зрения производительности?
  2. Есть ли какие-либо индексы, которые я мог бы построить, и они могли бы помочь с вышеуказанным запросом? Я не уверен в индексировании данных, однако, прочитав в the RDF Index Scheme section of RDF Performance Tuning, мне интересно, подходит ли схема индексации Virtuoso 7 по умолчанию для запросов, подобных приведенным выше. Хотя предикаты определены в тройных шаблонах SPARQL предыдущего запроса, существует много тройных шаблонов, которые не определили субъект или предикат. Может ли это быть серьезной проблемой в отношении производительности?
  3. Возможно, есть структура синтаксиса SPARQL, о которой я не знаю и могу помочь в вышеупомянутом запросе. Не могли бы вы что-нибудь предложить? Например, я уже улучшил производительность, удалив STR() отливки и используя функцию isLiteral(). Не могли бы вы предложить что-нибудь еще?
  4. Возможно, вы могли бы предложить использовать сложную структуру синтаксиса SPARQL?

Пожалуйста, обратите внимание, что я использую Виртуоз открытым исходным кодом, построенной на Ubuntu, версия: 07.20.3214, Build: 14 окт 2015.

С уважением, Pantelis Natsiavas

ответ

4

Первое - ваш Виртуозная сборка давно устарела; рекомендуется обновить до 7.20.3217 as of April 2016 (или более поздней).

предложения по оптимизации естественным образом ограничены при взгляде на упрощенной запрос., Но вот несколько мыслей, в частности, нет порядка ...

  • Index Scheme Selection, док раздел RDF Performance Tuning следующие RDF Index Scheme, предлагает пара альтернативных и/или дополнительных индексов, которые могут иметь смысл для ваших запросов и данных. Как вы говорите, некоторые из ваших шаблонов будут иметь определенный граф и объект, а также неопределенный субъект и предикат, некоторые другие индексы могут также имеют смысл (например, GOPS, GOSP), в зависимости от некоторых других факторов.

  • В зависимости от того, насколько ваши данные изменились с момента первоначальной загрузки, возможно, стоит перестроить индексы свободного текста с помощью этой команды SQL (которая может быть выпущена через любой SQL-интерфейс - iSQL, ODBC, JDBC и т. Д. ,) -

    VT_INC_INDEX_DB_DBA_RDF_OBJ() 
    
  • Using the bif:contains predicate может привести к существенно более высокую производительность, чем regex() фильтров, например замена -

    FILTER (isLiteral(?variableO) && REGEX(?variableO, "literalA", "i")) . 
    

    - с -

    ?variableO bif:contains "'literalA'" . 
    FILTER (isLiteral(?variableO)) . 
    
  • Explain() and profile() может быть полезным в оптимизации запросов усилия. Большая часть этого выпуска предназначена для анализа Development, поэтому это может не означать многого для вас, но предоставление его other Virtuoso users может по-прежнему давать полезные предложения.

  • По целому ряду причин предикат rdf:type (часто выражаемый как a, благодаря семантическому сахару SPARQL/Turtle) может быть убийцей производительности. Удаление этих предикатов из графического шаблона, вероятно, значительно повысит производительность. При необходимости существуют другие способы ограничить набор решений (например, путем тестирования атрибутов, которыми обладают только ваши объекты rdf:type), которые не имеют таких негативных воздействий.

(ObDisclaimer:. OpenLink Software производит Virtuoso, и использует меня)

Смежные вопросы