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, эффективно запуская атаку типа «отказ в обслуживании».
Теперь, когда вы нашли решение, возможно, вы можете обновить запрос SPARQL в вопросе, чтобы отразить то, что было проблемой _actual_ (т. Е. Обновить вопрос, чтобы быть выбранным? Label? Filmwhere {...} 'или 'select? label, где {...}', чтобы мы могли создать ответ, который обращается к нему? –