Разница в производительности между использованием ключевого слова VALUES и непосредственным использованием URI в запросе? - PullRequest
1 голос
/ 04 июля 2019

У меня довольно сложный запрос SPARQL со структурой, описанной ниже, включающей несколько графовых шаблонов, UNION и вложенный FILTER NOT EXISTS.

Я хочу, чтобы запрос оставался общим, и я хочу иметь возможность вводить значения для определенных переменных во время выполнения, и моя идея состоит в том, чтобы добавить ключевое слово VALUES в конце запроса, чтобы указать значение определенного переменные в запросе. В приведенной ниже структуре я установил значение ?x и проиллюстрировал все места в запросе, где применяется ?x.

Однако в Fuseki я вижу, что выполнение такого запроса занимает от 4 до 5 секунд, но ручная замена переменной ?x в запросе на URI вместо указания предложения VALUES делает его очень быстрым. быстро.

  • Я всегда думал, что использование ключевого слова VALUES в конце предложения WHERE похоже на установку значений для некоторых переменных, встроенных в строку, поэтому я ожидаю, что использование предложения VALUES или замена переменных на соответствующие им URI будут то же самое с точки зрения выполнения запроса. Может ли кто-нибудь подтвердить ожидаемое поведение ключевого слова VALUES? также объясните разницу между его использованием вне условия WHERE или внутри предложения WHERE?
  • Изменяет ли то, что переменная, установленная с помощью VALUES в предложении FILTER NOT EXISTS, что-то меняет?
  • Можете ли вы подтвердить, что это правильный подход для требования выше (я хочу, чтобы запрос оставался универсальным, и я хочу иметь возможность вводить значения для определенных переменных во время выполнения)?
  • Возможно ли, что это поведение зависит от того, как Fuseki обрабатывает VALUES?

Спасибо!

SELECT DISTINCT ...
WHERE {
    # ?x ...
    # ... basic graph pattern here 

    {
      {
        # ... basic graph pattern here 

        FILTER NOT EXISTS {
            # ?x ...
            # ... basic graph pattern here
        }

        FILTER NOT EXISTS {
            # ... basic graph pattern here
            FILTER NOT EXISTS {
                # ?x ...
                # ... basic graph pattern here
            }
        }       
      }
      UNION
      {
        ?x ...
        # ... basic graph pattern here
      }
      UNION
      {
        # ... basic graph pattern here

        FILTER NOT EXISTS {
            ?x ...
            # ... basic graph pattern here
        }

        FILTER NOT EXISTS {
            # ... basic graph pattern here
            FILTER NOT EXISTS {
                ?x ...
                # ... basic graph pattern here
            }
        }
      }
      UNION
      {
        ?x ...
      }
    }
}
VALUES ?x { <http://example.com/Foo> }

1 Ответ

3 голосов
/ 04 июля 2019

Не должно быть ответа, но форматирование в комментариях невозможно ...

Существует, по крайней мере, очевидное различие в дереве алгебры. Как это обрабатывается, вероятно, зависит от реализации. Энди знает лучше и, надеюсь, даст более полезный ответ, чем мой.

без VALUES:

Запрос

SELECT  ?s ?o
WHERE
  {   { <test_val>  <p>  ?o }
    UNION
      { <test_val>  <p>  ?o
        FILTER NOT EXISTS { <test_val>  a                   ?type }
      }
  }

Дерево алгебры (оптимизировано)

(base <http://example/base/>
  (project (?s ?o)
    (union
      (bgp (triple <test_val> <p> ?o))
      (filter (notexists (bgp (triple <test_val> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type)))
        (bgp (triple <test_val> <p> ?o))))))

с VALUES

Запрос

SELECT  ?s ?o
WHERE
  {   { ?s  <p>  ?o }
    UNION
      { ?s  <p>  ?o
        FILTER NOT EXISTS { ?s  a                     ?type }
      }
  }
VALUES ?s { <test_val> }

алгебраическое дерево

(base <http://example/base/>
  (project (?s ?o)
    (join
      (union
        (bgp (triple ?s <p> ?o))
        (filter (notexists (bgp (triple ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type)))
          (bgp (triple ?s <p> ?o))))
      (table (vars ?s)
        (row [?s <test_val>])
      ))))

Дерево алгебры (оптимизировано)

(base <http://example/base/>
  (project (?s ?o)
    (sequence
      (table (vars ?s)
        (row [?s <test_val>])
      )
      (union
        (bgp (triple ?s <p> ?o))
        (filter (notexists (bgp (triple ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type)))
          (bgp (triple ?s <p> ?o)))))))
...