2013-09-10 3 views
0

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

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

Буквальный возвращается просто отлично, я даже попробовал ресурс, но все-таки ресурс нулевой «фильм?». Вот мой 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 только пользовательский ввод, например, "Бэтмен".

Edit: я была опечатка в моем запросе: это был мой запрос:

Строка sparqlQuery = "PREFIX MDB: http://data.linkedmdb.org/resource/movie/film" + "ПРЕФИКСОВ RDFS: http://www.w3.org/2000/01/rdf-schema#"? + «Выбрать маркировать фильм "+ " где "+" {? Film mdb: id? Uri. " + "? film rdfs: label? label." + " }" + "";

Посмотрите внимательно на пленку и где, они становятся пленкой, вот проблема .

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

+0

Теперь, когда вы нашли решение, возможно, вы можете обновить запрос SPARQL в вопросе, чтобы отразить то, что было проблемой _actual_ (т. Е. Обновить вопрос, чтобы быть выбранным? Label? Filmwhere {...} 'или 'select? label, где {...}', чтобы мы могли создать ответ, который обращается к нему? –

ответ

2

documentation for QuerySolution#getResource говорит

Resource getResource(String varName)

возвращает значение названного переменных в этом связывающем, литье к ресурсу. Возврат нулевого значения указывает, что переменная отсутствует в этом решении. Исключение указывает, что оно присутствовало, но не ресурс.

Если вы получаете 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, эффективно запуская атаку типа «отказ в обслуживании».

+0

Если я использую Label, я получаю следующую ошибку com.hp.hpl.jena.rdf.model.impl.LiteralImpl не может быть cast to com.hp.hpl.jena.rdf.model.Resource Кстати, разве это не getURI? – miniHessel

+0

Вы правы, это должно быть getURI, и я обновил свой ответ. Ожидается исключение, так как за javadoc для getResource: «Исключение указывает, что оно присутствовало, но не ресурс». A Literal _is not_ a Resource. Ресурс _is not_ a Literal. Вы можете сделать qs.getResource («film») 'и получить ресурс , поскольку эти ценности являются ресурсами, и вы можете сделать 'qs.getLiteral (" label ")' и получить литерал, поскольку эти значения являются литералами. –

+0

У меня тоже была опечатка в моем коде. Я имел в виду 'qs.getResource (« фильм »). GetURI()', а не 'qs.getResource (" label "). GetURI()'. Сожалею. Я действительно сказал, что «вам нужен URI переменной фильма, с которой вы бы справились», что должно было предполагать, что «label» «является копией/вставкой для« фильма ». –

Смежные вопросы