Запрос SPARQL с большим количеством значений внутри блока «значения»

У меня есть список узлов, и я хочу получить тройки, содержащие все отношения между этими узлами.

Вот что я сделал до сих пор:

PREFIX myPrefix:  <http://example.org/myPrefix/>
SELECT ?a ?relation ?b
WHERE{
values ?a { myPrefix:id_00083184 myPrefix:id_00083187
            myPrefix:id_00083189 myPrefix:id_00083182
            myPrefix:id_09463313 myPrefix:id_00000790
            myPrefix:id_00073965 myPrefix:id_00073966
            myPrefix:id_00016990 myPrefix:id_08380001
            myPrefix:id_00019131 myPrefix:id_03739215
            myPrefix:id_00019129 myPrefix:id_00034482
            myPrefix:id_00098617                     

            }

values ?b { myPrefix:id_00083184 myPrefix:id_00083187
            myPrefix:id_00083189 myPrefix:id_00083182
            myPrefix:id_09463313 myPrefix:id_00000790
            myPrefix:id_00073965 myPrefix:id_00073966
            myPrefix:id_00016990 myPrefix:id_08380001
            myPrefix:id_00019131 myPrefix:id_03739215
            myPrefix:id_00019129 myPrefix:id_00034482
            myPrefix:id_00098617                     
             }
    ?a ?relation ?b .
}

При этом я получаю то, что хочу, то есть все отношения между узлами в моем (внешнем) списке; используя values и повторяя узлы для ?a и ?b. Но проблема в том, что мой список узлов может быть очень большим; иногда он может иметь до 1000 узлов и это только небольшой случай; и этот запрос занимает слишком много времени для выполнения.

Есть ли лучший способ сделать то, что мне нужно? Это единственный подход, который я нашел, но я не очень хорошо разбираюсь в SPARQL, так что есть ли способ сделать это правильно?

PS: я получаю список узлов извне из запроса из другой базы данных и с помощью Java я создаю запрос, добавляя каждый узел в список.

Все это звучит очень по-пещерному, но, как я уже сказал, я начинаю использовать SPARQL.

Большое спасибо.


person antorqs    schedule 10.05.2016    source источник
comment
Я думал, что вы можете улучшить производительность запроса, поскольку это очень простой запрос. Если у вас есть n узлов, сложность наивного решения, очевидно, O(n²)   -  person UninformedUser    schedule 10.05.2016
comment
Как вы думаете, как я могу улучшить производительность моего запроса? Я имею в виду, это мой вопрос @AKSW   -  person antorqs    schedule 11.05.2016
comment
Эм, извините, я имел в виду, что я так не думаю. Конечно, если отношение симметричное, вы можете попытаться не проверять и a r b, и b r a, но это действительно будет вашей задачей при построении запроса.   -  person UninformedUser    schedule 11.05.2016


Ответы (1)


То, что вы делаете сейчас, вероятно, является наиболее общим способом сделать это.

Отдельные API, например Jena, могут поддерживать другие способы указания набора начальных привязок, которые функционально эквивалентны блоку значений, но при этом фактический запрос может быть намного короче. Например, см. мой ответ на Сохранение и повторное использование результата запроса SPARQL. Ответ на Добавить предложение текстового поиска where в запрос SPARQL также содержит пример начальных привязок в Jena.

person Joshua Taylor    schedule 10.05.2016