Получить URI из ресурса в ResultSet

Я пытаюсь получить URI из ресурса в Java, но это всегда null, Прямо сейчас я пытаюсь это:

for ( ; rs.hasNext() ; ) {
  QuerySolution qs  = rs.next();
  System.out.println( qs.getLiteral("label"));
  System.out.println( qs.getResource("label"));
  …

Литерал возвращается просто отлично, я даже попробовал ресурс "? Film", но все равно ресурс нулевой. Вот мой запрос SPARQL:

PREFIX mdb: <http://data.linkedmdb.org/resource/movie/film>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
select ?label ?film where {
  ?film mdb:id ?uri .
  ?film rdfs:label ?label . 
  filter regex(?label,  + queryVar +
}

queryVar это просто пользовательский ввод, например "Бэтмен".

Изменить: в моем запросе была опечатка: это был мой запрос:

String sparqlQuery = "PREFIX mdb: http://data.linkedmdb.org/resource/movie/film" + "PREFIX rdfs: http://www.w3.org/2000/01/rdf-schema " + "select? label? film "+" где " + "{?film mdb:id?uri ." + "?film rdfs:label?label . " + " }" + "";

Посмотрите внимательно на? Фильм и где они становятся фильмом, вот в чем проблема.

Благодаря Джошуа я понял это.

1 ответ

Решение

Документация дляQuerySolution#getResource говорит

Resource getResource(String varName)

Вернуть значение именованной переменной в этой привязке, приведя к Resource. Возврат NULL означает, что переменная отсутствует в этом решении. Исключение указывает, что он присутствовал, но не ресурс.

Если вы получаете null, то какое-то значение отсутствует в решении запроса. Однако, не видя вашего фактического запроса, невозможно определить, по какой причине вы получаете пустые результаты (например, queryVar не то, что вы думаете) или нет. Если queryVar это просто строка без окружающих кавычек, вы получите запрос, как

filter regex(?label,Batman)

вместо

filter regex(?label,"Batman")

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

PREFIX mdb: <http://data.linkedmdb.org/resource/movie/film>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
select ?label ?film
where {
  service <http://data.linkedmdb.org/sparql> {
    ?film mdb:id ?uri .
    ?film rdfs:label ?label . 
    filter regex(?label, "Batman")
  }
}

Когда я запускаю это, я получаю результаты как:

$ arq --query query.sparql --data data.n3 
-----------------------------------------------------------------------------------------
| label                                | film                                           |
=========================================================================================
| "Batman"                             | <http://data.linkedmdb.org/resource/film/2>    |
| "Batman"                             | <http://data.linkedmdb.org/resource/film/3>    |
| "Batman & Robin"                     | <http://data.linkedmdb.org/resource/film/4>    |
| "Batman: Mask of the Phantasm"       | <http://data.linkedmdb.org/resource/film/737>  |
| "Batman: Mystery of the Batwoman"    | <http://data.linkedmdb.org/resource/film/974>  |
| "Batman Beyond: Return of the Joker" | <http://data.linkedmdb.org/resource/film/1802> |
| "Batman & Mr. Freeze: SubZero"       | <http://data.linkedmdb.org/resource/film/2124> |
-----------------------------------------------------------------------------------------

в котором label а также film всегда связаны. Все метки являются литералами, поэтому вы должны быть в состоянии сделать

qs.getLiteral("label")

и получить буквальный. Звучит так, как будто вы хотите URI film переменная, с которой вы будете делать

qs.getResource("film").getURI()

Вы могли бы, конечно, использовать toString() потом, если вы хотите строку URI.

В сторону, а не делать

"filter(?label, " + queryVar + "…"

Вы можете рассмотреть возможность использования ParameterizedSparqlString для безопасной замены queryVar в. В противном случае, что происходит с queryVar это что-то вроде

"\"Batman\") UNION { ?film hasPassword ?label }"

и это подставляется в? Вы вдруг пропускаете кучу информации. Даже если не получится ничего чувствительного, вы все равно можете вызвать большую нагрузку на конечную точку SPARQL, эффективно запустив атаку типа "отказ в обслуживании".

Другие вопросы по тегам