Как сопоставить точное слово через SPARQL

Мое приложение должно соответствовать правильному слову, например, C или C++ со SPARQL. У меня есть следующий запрос SPARQL

String prolog = "PREFIX kb: <" + VBOOK.getURI() + ">";

String queryString = prolog

+ "\n"

+ "SELECT * "

+ "WHERE {?x kb:Price ?price. ?x kb:Currency ?currency. ?x kb:Title ?title. ?x kb:Count ?count. "

+ "OPTIONAL {?x kb:Description ?description}."

+ "FILTER regex(?title, \"" +title + "\")}";

Это соответствует мне всем книгам, даже C++, C# и таким книгам, как -Real Concepts in Embedded Systems (из-за слова «Концепции», имеющего «C»).

если я изменю последнюю строку на

+ "FILTER regex(?title, \"" +"^"+title + "\")}";

и если заголовок, например, «C», то мой запрос соответствует только тем книгам, названия которых начинаются с буквы «C». Таким образом, такие книги, как «Программирование в ANSI C», не выбраны.

Я также пробовал со следующим изменением в последней строке

+ "FILTER regex(str(?title), \"" +title + "\")}";

Даже это мне мало помогло.

Как мне изменить, чтобы получить книги, относящиеся к «C», даже если название книги не начинается с C?

С уважением, Арчана.


person Archana    schedule 21.03.2011    source источник
comment
Дублировано на semanticoverflow.com/questions/3750/   -  person RobV    schedule 22.03.2011


Ответы (2)


Этот вопрос сводится к тому, какие функции регулярных выражений поддерживает ваш механизм запросов. Если он поддерживает сопоставление границ \b слов, вы можете решить свою проблему, изменив последнюю строку на

 + "FILTER regex(?title, \"\\b" + title + "\\b\")}";
person laalto    schedule 21.03.2011
comment
Нет, это не дает мне никакого результата, когда я набираю «C». - person Archana; 21.03.2011
comment
@Archana: Какой механизм запросов вы используете? - person laalto; 21.03.2011
comment
ARQ-2.8.5 и Jena-2.6.3. Я использую сервер tomcat, т.е. сервер Java. - person Archana; 21.03.2011
comment
@Archana: ARQ использует java.util.regex, который поддерживает \b. Ваша проблема в другом. Возможно, чувствительность к регистру? Вы можете добавить третий аргумент "i" в SPARQL regex, чтобы он соответствовал регистру без учета регистра. - person laalto; 21.03.2011

Вам вообще нужно регулярное выражение?

Вместо того, чтобы делать заголовок переменной, просто исправьте его так:

?x kb:Title "название" .

то есть в вашем коде

Заголовок строки = "С++";

«ГДЕ {?x kb:Цена ?цена. ?x kb:Валюта ?валюта.

person danja    schedule 29.03.2011
comment
Мне нужно попробовать это. Но на данный момент мой ввод, если C ++ набран, программа использует C, поэтому мне нужно это понять. Я просто подумал, что это было причиной того, что С++ не искали. Вернемся к этому решению, как только мой вклад будет правильно принят. - person Archana; 30.03.2011