Можно ли выполнять эти типы запросов SPARQL?

Предположим, у нас есть огромный RDF-граф, и мы хотим сделать следующее: (Я попробовал, и это не работает - хотел знать, неправильно ли я строю запрос или какая-то проблема с дампом rdf).

select ?n ?o 
where {
    ?n <name_of_a_node> <name_of_this_node>.
    ?n ?p ?o.
    ?o <type_of_a_node> ?t.
    FILTER(REGEX(STR(?t), "president")).
}

Приведенный выше запрос говорит, что я знаю имя узла n. Итак, я получаю URI узла n. Затем я извлекаю все предикаты узла n и других узлов, связанных с этим предикатом. Для каждого из этих узлов, которые подключены к узлу а, я хочу посмотреть на их свойство (свойство типа) и получить только те узлы, у которых есть подстрока в их свойстве типа.

Возможно ли это в SPARQL? По сути, стоя на узле и просматривая все другие узлы, к которым подключен этот узел, а затем извлекая только те узлы, которые соответствуют другому условию их свойств.

В противном случае, должен ли я просто получить все узлы, к которым подключен узел n, и для каждого из них запустить еще один запрос SPARQL, чтобы выполнить эту проверку?

Я использую JENA для хранения данных.


person London guy    schedule 31.01.2013    source источник
comment
Я попробовал это, и это не работает, никому не говорит достаточно, чтобы помочь вам. Какие симптомы не работали? Какие предикаты вы использовали для name_of_a_node и т. д.? По сути, да, структура вашего запроса в порядке, но чтобы помочь вам заставить его работать, нам нужны подробности.   -  person Ian Dickinson    schedule 31.01.2013
comment
Вы добились каких-либо успехов в этом? Также обратите внимание, что SPARQL 1.1 поддерживает contains, который, вероятно, будет более эффективным, чем regex.   -  person Joshua Taylor    schedule 06.03.2014


Ответы (1)


Да, это возможно, но писать такой запрос почти всегда очень не рекомендуется.

Любой FILTER, который вы используете, требует механизма SPARQL для просмотра всех возможных решений и оценки выражений в нем, в то время как многие выражения быстро и дешево вычисляются, некоторые, такие как REGEX, очень дороги.

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

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

person RobV    schedule 31.01.2013
comment
stardog.com также поддерживает полнотекстовый поиск и тот же синтаксис LARQ, что и Jena. AllegroGraph (franz.com/agraph), afaik также поддерживает своего рода полнотекстовый поиск, но я Я не уверен, что он интегрирован в ответ на запрос SPARQL. Но у вас есть другие варианты, кроме LARQ. - person Michael; 31.01.2013