Первый вопрос: я хотел бы знать, если репозиторий со временем станет огромным, и я хочу запускать запросы к нему, повлияет ли скорость на производительность?
да. Степень, в которой размер влияет на производительность запроса, зависит от ряда факторов, в первую очередь от фактической реализации базы данных, которую вы используете, от того, как вы настроили эту базу данных, а также от формы ваших фактических данных (например, количество операторов типов, д.), и, конечно же, типы запросов, которые вы делаете. Sesame – это платформа с четырьмя хранилищами, которая поставляется с несколькими встроенными типами баз данных (в памяти и нативными), но, конечно же, существует множество сторонних баз данных RDF, совместимых с Sesame, каждая из которых имеет свои характеристики производительности. .
Второй вопрос (если ответ на первый вопрос положительный): если я использую именованные графы для разных наборов троек и запускаю на них запросы, смогу ли я получить результат намного быстрее, чем если бы я обычно запускал их на всем репозитории?
Опять же, это зависит от используемой вами базы данных и ее конфигурации, а также от типов запросов, которые вы используете.
Предположим, вы используете собственное хранилище Sesame и включили хотя бы один индекс, в котором именованный граф (или «контекст», как его называют в Sesame) является первичным ключом (например, cspo
) — и, кроме того, у вас есть обычный индексы по умолчанию (т.е. spoc
и posc
). В этом сценарии использование именованных графов может иметь заметное значение в производительности, если вы можете использовать его в качестве фильтра (то есть сам именованный граф предварительно выбирает определенное подмножество общего потенциального результата): планировщик запросов может использовать cspo
index для быстрого увеличения гораздо меньшего подмножества всего репозитория.
Однако обратите внимание, что в ваших конкретных примерах запросов это не будет иметь большого значения: в вашем примере вы предполагаете, что все ресурсы типа csm:someClass
встречаются ровно в одном конкретном именованном графе (если бы это было не так, два запроса, конечно, не возвращает тот же результат), поэтому фактический выбор этого именованного графа не приводит к дальнейшему уменьшению потенциального набора ответов (по сравнению с простым выбором всех ресурсов типа csm:someClass
).
Чтобы объяснить более подробно: механизм запросов будет выполнять поиск в индексах для каждого из шаблонов графика в вашем запросе. Первый шаблон (?a a csm:someClass
) является самым дешевым для поиска, так как он имеет только одну свободную переменную. Движок будет использовать для этой цели индекс posc
, так как он знает первые два ключа для этого индекса. Второй шаблон запроса будет основан на результате первого (поэтому ?a
будет создан на основе результата первого поиска). В запросе с именованным графиком движок выберет индекс cspo
, поскольку мы знаем и c
, и s
. В запросе без именованного графа будет выбран индекс spoc
, так как мы знаем s
(но не c
). Однако, поскольку все значения с этим конкретным s
всегда встречаются в графе с одним и тем же именем, оба поиска фактически будут охватывать почти одинаковое количество значений: все возможные комбинации значений o
и p
. Индекс spoc
, конечно, также будет находиться в диапазоне от c
, но для него всегда будет только одно единственное значение, так что это очень быстрый поиск. Таким образом, оба индекса вернут свои результаты за очень сравнимое время, и знание c
заранее не дает прироста производительности (кроме того, я несколько упрощаю работу механизма запросов, чтобы проиллюстрировать это).
Именованные графы — отличный инструмент для целей организации данных, и если они у вас есть, их использование в запросах — хорошая идея, поскольку это может повысить производительность (и уж точно не повредит). Но я бы не стал организовывать свои данные в именованные графики исключительно для повышения производительности запросов.
person
Jeen Broekstra
schedule
08.11.2015