Как выполнить запрос SPARQL, используя bif:regexp_match в Jena

У меня есть следующий запрос SPARQL на Virtuoso:

PREFIX wd: <http://www.wikidata.org/entity/>
SELECT DISTINCT ?p, ?title WHERE {
   ?p a ?c.
   ?c rdfs:subClassOf* wd:Q2431196.
   ?p rdfs:label ?title .
   FILTER (bif:regexp_match("^Vamp( [(].*[)])?$", ?title))
}

На этой конечной точке SPARQL все работает нормально. Он возвращает телешоу «Вамп», а также «Вамп» (теленовелла), как и ожидалось.

Теперь я пытаюсь сделать то же самое на Java, используя API Jena, и это не удается следующим образом.

Исключение в потоке "main" com.hp.hpl.jena.query.QueryParseException: строка 10, столбец 204: имя с неразрешенным префиксом: bif:regexp_match

Я нашел решение избавиться от исключения Jena, как было предложено для bif:contains. Тогда запрос будет следующим:

PREFIX wd: <http://www.wikidata.org/entity/>
SELECT DISTINCT ?p, ?title WHERE {
   ?p a ?c.
   ?c rdfs:subClassOf* wd:Q2431196.
   ?p rdfs:label ?title .
   ?title <bif:regexp_match> "^Vamp( [(].*[)])?$"
}

Однако этот запрос не возвращает никаких элементов, как это делал предыдущий запрос. Он также не возвращает никаких элементов в веб-интерфейсе конечной точки SPARQL (как это делал предыдущий запрос).

Я делаю что-то неправильно? Как я могу правильно выразить это?

ps: использование FILTER REGEX( ?title, "^Vamp( [(].*[)])?$") работает в конечной точке веб-SPARQL, но выдает следующую ошибку при использовании Java/Jena:

16 сентября 2015 г., 15:16:32.

Я думаю, что эта ошибка связана с ( ) символами..


person Bernardo Ferreira Bastos Braga    schedule 16.09.2015    source источник
comment
Определенно похоже, что проблема в регулярном выражении, либо в вашей конструкции, либо в интерпретации Virtuoso. Я не могу предложить немедленное решение, но я могу и предлагаю вам задать вопрос более узкой аудитории — [списку рассылки пользователей Virtuoso (sourceforge.net/p/virtuoso/mailman/virtuoso-users).   -  person TallTed    schedule 20.09.2015


Ответы (4)


используйте этот PREFIX bif:<bif:>
вместо PREFIX bif:<> для jena.

person Sachin Shetti    schedule 29.08.2016
comment
Окружите свой код обратными кавычками (`) или добавьте 4 пробела перед ним (в отдельной строке), чтобы показать его как код. См. stackoverflow.com/editing-help#code. - person Ivar; 29.08.2016

Вы были правы в своем шаблоне регулярного выражения, просто немного отредактировав, когда дело доходит до java.

Чтобы он работал в java, просто поставьте левые скобки (после ^ и поставьте правые скобки) перед $.

Ваш шаблон регулярного выражения должен быть таким:

"^(Вамп([(].*[)])?)$";

надеюсь это поможет

person james jelo4kul    schedule 16.09.2015
comment
Спасибо за ваш вклад, но это тоже не работает. Я думаю, что виртуоз не работает с ‹bif:regexp_match› - person Bernardo Ferreira Bastos Braga; 16.09.2015
comment
Я отредактировал вопрос, чтобы добавить детали. Подход ‹bif:regexp_match› также ничего не возвращает по запросу в веб-интерфейсе. - person Bernardo Ferreira Bastos Braga; 16.09.2015
comment
в веб-интерфейсе FILTER REGEX(?title,^(Vamp)(( [(].*[)])?)$) возвращает то, что я ожидаю, но ?title ‹bif:regexp_match› ^(Vamp)(( [( ].*[)])?)$ ничего не возвращает - person Bernardo Ferreira Bastos Braga; 16.09.2015
comment
не могли бы вы уточнить, почему порядок скобок должен повлиять на это? - person Bernardo Ferreira Bastos Braga; 16.09.2015
comment
скобки влияют на это в java, потому что без них Vamp не будет включен в шаблон, который вы хотите найти; поэтому ваш шаблон ограничен некоторыми совпадениями. Спасибо за ваши ответы. Надеюсь, я предложил некоторую помощь - person james jelo4kul; 17.09.2015

Jena не сможет проанализировать ваш SPARQL, так как он недействителен. Основная проблема в том, что bif: это встроенный префикс Virtuoso. Чтобы позволить Jena разобрать его, вам нужно добавить

PREFIX bif:<>

на ваш запрос.

person chrisis    schedule 17.09.2015
comment
Это не работает. Ни в Йене, ни в веб-интерфейсе. Он выдает следующее исключение: Исключение в основном потоке HttpException: 400 Bad Request Virtuoso 37000 Ошибка SP030: Компилятор SPARQL, строка 11: Префиксы 'sql:' и 'bif:' зарезервированы для имен SQL в (...) - person Bernardo Ferreira Bastos Braga; 17.09.2015

Как ответил AndyS в здесь, проблема в том, что bif является специфичной для виртуоза функцией, поэтому вам следует использовать QueryEngineHTTP вместо QueryExecutionFactory.sparqlService. Это отправит ваш запрос непосредственно в конечную точку и не пропустит его через парсер Jena.

QueryEngineHTTP query_engine = new QueryEngineHTTP(endpoint, query);
person EurikaIam    schedule 22.09.2015
comment
Обратите внимание, что это также описано в Документация поставщика Virtuoso Jena... - person TallTed; 22.09.2015