我正在尝试从Java中的资源获取URI,但它总是null
。现在,我正在尝试这个:
for ( ; rs.hasNext() ; ) {
QuerySolution qs = rs.next();
System.out.println( qs.getLiteral("label"));
System.out.println( qs.getResource("label"));
…
文字返回得很好,我甚至尝试过资源“?film”,但资源仍为null。 这是我的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#“+”选择?标签?电影“+ “where”+“{?film mdb:id?uri。” +“?film rdfs:label?label。”+“ }“+”“;
仔细看看?电影和哪里,他们成为电影的地方,就是这样 问题
感谢约书亚,我明白了。
答案 0 :(得分:2)
documentation for QuerySolution#getResource
说
Resource getResource(String varName)
返回named的值 此绑定中的变量,转换为资源。返回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")
并得到一个文字。这听起来更像是你想要film
变量的URI,你可以使用
qs.getResource("film").getURI()
如果你想要URI字符串,你当然可以使用toString()
。
顺便说一下,而不是做
"filter(?label, " + queryVar + "…"
您可能需要考虑使用ParameterizedSparqlString安全地替换queryVar。否则,queryVar
会发生类似
"\"Batman\") UNION { ?film hasPassword ?label }"
它被取代了吗?你突然泄漏了一堆信息。即使没有任何敏感信息泄露,您仍然可能最终导致SPARQL端点出现大量负载,从而有效地发起拒绝服务攻击。