2015-09-16 9 views
1

У меня есть следующий запрос SPARQL на Виртуоз:Как сделать SPARQL запрос с использованием BIF: regexp_match на Jena

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)) 
} 

На this SPARQL endpoint, он отлично работает. Он возвращает ТВ-шоу Vamp, а также Vamp (telenovela), как и ожидалось.

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

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

Я нашел решение, чтобы избавиться от исключения Йены, как предложено для 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 либо (как это делал предыдущий запрос)

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

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

16 сентября 2015 3:16:32 PM org.apache.jena.riot. system.ErrorHandlerFactory $ ErrorLogger LogError СИЛЬНЫЙ: Invalid байт 2 из 3-х байт UTF-8 sequence.`

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

+1

Это определенно похоже, что проблема заключается в регулярном выражении, как в вашей конструкции, так и в интерпретации Virtuoso. Я не могу предложить немедленное решение, но могу и предлагаю вам поднять вопрос на более целенаправленную аудиторию - список рассылки [Virtuoso Users users (http://sourceforge.net/p/virtuoso/mailman/virtuoso-users/) , – TallTed

ответ

1

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

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

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

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

надеюсь, что это помогает

+0

Спасибо за ваш вклад, но он не работает. Я думаю, что виртуоз не работает с

+0

Я отредактировал вопрос, чтобы добавить подробную информацию. Подход не возвращает ничего в запросе в веб-интерфейсе. –

+0

на веб-интерфейс ФИЛЬТР REGEX (? Название, "^ (Vamp) (([(]. * [)])?) $") возвращает то, что я ожидаю, но ? Название <БИФ : regexp_match> "^ (Vamp) (([[]. * [)])?) $" ничего не возвращает –

0

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

PREFIX bif:<> 

к вашему запросу.

+0

Это не работает. Не в Йене и не в веб-интерфейсе. Он выдает следующее исключение: Исключение в потоке «main» HttpException: 400 Bad Request Ошибка Virtuoso 37000 SP030: компилятор SPARQL, строка 11: Префиксы «sql:» и «bif:» зарезервированы для имен SQL в (.. .) –

0

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

QueryEngineHTTP query_engine = new QueryEngineHTTP(endpoint, query); 
+0

Обратите внимание, что это также описано в [Virtuoso Jena Provider documentation] (http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VirtJenaProvider#Bypass%20Jena/ARQ%20parser) .. – TallTed

2

использовать этот PREFIX bif:<bif:>
вместо PREFIX bif:<> в течение Йены.

+1

Окружайте свой код обратными окнами (') или добавьте перед ним 4 пробела (на отдельной строке), чтобы показать его как код. См. Http://stackoverflow.com/editing-help#code – Ivar