Sparql VS XQuery (MarkLogic) - PullRequest
       28

Sparql VS XQuery (MarkLogic)

1 голос
/ 11 марта 2019

После игры с MarkLogic я понял, что результаты троек можно получить несколькими способами, например, полностью используя Xquery или SPARQL. Таким образом, вопрос в том, есть ли какие-либо преимущества использования SPARQL над XQuery? Есть ли какая-то индексация, которая делает SPARQL намного быстрее, чем поиск определенного семантического запроса?

Например, если мы извлекаем все семантические документы с помощью предиката "/like".

SPARQL

SELECT *
WHERE {
  ?s </like> ?o
}

1008 * XQuery *

cts:search(fn:doc(), cts:element-query(xs:QName("sem:predicate"), "/like"))

Следовательно, есть ли разница в эффективности между этими двумя?

Ответы [ 2 ]

3 голосов
/ 11 марта 2019

Небольшой нюанс здесь: поиск - это поиск документов.Если у вас нет одной тройки на каждый документ, выборка троек, которые совпадают из пачки в документе, потребует извлечения всего документа с диска (хотя он может быть в кеше).SPARQL предназначен для выбора тройных данных из тройных индексов, что может потребовать меньше дискового ввода-вывода.Конечно, если вы делаете что-то кроме простой выборки простого тройного шаблона, вам понадобится понимание отношений, которые дает вам SPARQL.

3 голосов
/ 11 марта 2019

Да, безусловно, есть различия.Является ли XQuery или SPARQL наиболее эффективным, однако полностью зависит от проблемы, которую вы пытаетесь решить.XQuery лучше всего подходит для запросов и обработки данных документов, в то время как SPARQL действительно позволяет легко рассуждать о данных RDF.

Это правда, что данные RDF сериализуются как XML в MarkLogic, и вы можете выполнять полнотекстовый поиск,и даже поместите в него индексы диапазона, если хотите, но данные RDF уже проиндексированы в тройном индексе, что даст вам более точные результаты, чем полнотекстовый поиск, описанный выше.

Также обратите внимание, что SPARQL позволяет вамследовать предикатным путям, что включает в себя много объединений.Это будет намного эффективнее, если делать это через SPARQL, чем через XQuery, потому что это в основном разрешается через тройной индекс.Представьте себе запрос SPARQL, подобный этому:

PREFIX pers: <http://my.persons/>;
PREFIX topic: <http://my.topics/>;
PREFIX pred: <http://my.predicates/>;
SELECT DISTINCT *
WHERE {
  ?person pred:likes topic:Chocolate;
          pred:friendOf+ ?friend.
  FILTER( ?friend = (pres:WhiteSolstice) )
  FILTER( ?friend != ?person )
}

Он пытается найти всех прямых и косвенных друзей, которым нравится шоколад.Я бы не стал писать что-то подобное в XQuery.

Опять же, есть и другие вещи, которые просты в XQuery и практически невозможны в SPARQL.Иногда эффективнее всего объединить их, выполнив sem: sparql изнутри XQuery и используя результаты для дальнейшей обработки в XQuery.Иногда это также зависит от того, в какой форме находятся ваши данные ..

HTH!

...