我试图从Java中的资源获取URI,但它总是 null
. 现在,我正在尝试这个:
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
只是用户输入,例如"Batman" .
编辑:我的查询中有一个拼写错误:这是我的查询:
String sparqlQuery =“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 . ”“}”“”;仔细看看?电影和它们成为电影的地方,这就是问题所在 .
感谢约书亚我明白了 .
1 回答
documentation for QuerySolution#getResource说
如果您收到
null
,则查询解决方案中不存在某些值 . 但是,如果没有看到您的实际查询,'s impossible to tell whether you'由于某种原因(例如,queryVar
不是您认为的那样)得到空结果,或者不是 . 如果queryVar
只是一个没有引号的字符串,那么你最终会得到一个类似的查询代替
无论如何,我将您的查询修改为我们可以使用Jena的命令行工具运行的查询:
当我运行这个时,我得到的结果如下:
其中
label
和film
始终绑定 . 所有标签都是文字,所以你应该能够做到得到一个文字 . 这听起来更像是你想要的
film
变量的URI当然,如果你想要URI字符串,你可以使用
toString()
.抛开而不是做
你可能想考虑使用ParameterizedSparqlString安全地替换queryVar . 否则,
queryVar
会发生什么它被取代了吗?你突然泄漏了一堆信息 . 即使没有任何敏感信息泄露,您仍然可能最终导致SPARQL endpoints 出现大量负载,从而有效地启动拒绝服务攻击 .