Сложный запрос SPARQL - подсказки по производительности Virtuoso?

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

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. Существуют ли какие-либо индексы, которые я мог бы создать, и они могли бы помочь с вышеуказанным запросом? Я не совсем уверен в индексации данных, однако читаю в в разделе «Схема индексации RDF» раздела «Настройка производительности RDF», мне интересно, подходит ли схема индексирования по умолчанию Virtuoso 7 для запросов, подобных приведенному выше. Хотя предикаты определены в шаблонах троек SPARQL в приведенном выше запросе, существует множество шаблонов троек, в которых не определены субъект или предикат. Может ли это быть серьезной проблемой с производительностью?
  3. Возможно, есть структура синтаксиса SPARQL, о которой я не знаю и которая могла бы очень помочь в приведенном выше запросе. Не могли бы вы что-нибудь предложить? Например, я уже улучшил производительность, удалив STR() приведений и используя функцию isLiteral(). Не могли бы вы предложить что-нибудь еще?
  4. Возможно, вы могли бы предложить чрезмерное использование сложной синтаксической структуры SPARQL?

Обратите внимание, что я использую версию Virtuoso с открытым исходным кодом, построенную на Ubuntu, версия: 07.20.3214, сборка: 14 октября 2015 г.

С уважением, Пантелис Нациавас


person Pantelis Natsiavas    schedule 28.09.2016    source источник


Ответы (1)


Во-первых, ваша сборка Virtuoso давно устарела; обновление до 7.20.3217 по состоянию на апрель 2016 г. (или более поздней версии) является настоятельно рекомендуется.

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

  • Выбор схемы индекса, RDF Раздел документации по настройке производительности после схемы индекса RDF, предлагает несколько альтернативных и / или дополнительных индексов, которые могут иметь смысл для ваших запросов и данных. Поскольку вы говорите, что некоторые из ваших шаблонов будут иметь определенные граф и объект, а также неопределенные субъект и предикат, некоторые другие индексы могут также иметь смысл (например, GOPS, GOSP), в зависимости от некоторых других факторов.

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

    VT_INC_INDEX_DB_DBA_RDF_OBJ ()
    
  • Использование предиката bif:contains может привести к значительно большей производительности, чем фильтры regex(), например, замена -

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

    - с участием -

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

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

(Заявление об отказе от ответственности: OpenLink Software создает Виртуоз, и нанял меня.)

person TallTed    schedule 28.09.2016