首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ResultSet中的资源中获取URI

从ResultSet中的资源中获取URI
EN

Stack Overflow用户
提问于 2013-09-10 14:39:41
回答 1查看 1.7K关注 0票数 0

我试图从Java中的a资源中获取URI,但它始终是null。现在,我正在尝试这样做:

代码语言:javascript
复制
for ( ; rs.hasNext() ; ) {
  QuerySolution qs  = rs.next();
  System.out.println( qs.getLiteral("label"));
  System.out.println( qs.getResource("label"));
  …

返回的文字很好,我甚至尝试了资源“?育婴”,但是资源仍然是空的。下面是我的SPARQL查询:

代码语言:javascript
复制
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只是用户输入,例如“蝙蝠侠”。

编辑:我的查询中有一个错误:这是我的查询:

字符串sparqlQuery =“前缀mdb:http://data.linkedmdb.org/resource/movie/film”+“前缀rdfs:http://www.w3.org/2000/01/rdf-schema#”+“选择?标签?薄膜”+“+ "{?薄膜mdb:id ?uri。”+“?胶片rdfs:标签?标签。”+“}”+“; 仔细看电影,在哪里,他们变成电影的地方,这就是问题所在。

多亏了约书亚我弄明白了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-10 15:46:08

QuerySolution#getResource

Resource getResource(String varName) 将此绑定中命名变量的值返回给资源。返回null表示此解决方案中不存在变量。异常表示它是存在的,而不是资源。

如果要获得null,则查询解决方案中不存在某些值。但是,如果没有看到实际的查询,就不可能知道是否出于某种原因(例如,queryVar不是您所认为的那样)而得到的结果是空的。如果queryVar只是一个没有周围引号的字符串,那么您将得到一个类似的查询

代码语言:javascript
复制
filter regex(?label,Batman)

而不是

代码语言:javascript
复制
filter regex(?label,"Batman")

无论如何,我将您的查询修改为可以使用Jena的命令行工具运行的查询:

代码语言:javascript
复制
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")
  }
}

当我运行这个程序时,我得到的结果如下:

代码语言:javascript
复制
$ 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> |
-----------------------------------------------------------------------------------------

其中labelfilm始终是绑定的。所有标签都是文字,所以您应该可以这样做。

代码语言:javascript
复制
qs.getLiteral("label")

得到一个字面上的。这听起来更像是您想要film变量的URI,这是您要使用的

代码语言:javascript
复制
qs.getResource("film").getURI()

当然,如果您想要URI字符串,可以在之后使用toString()

作为旁人,而不是做

代码语言:javascript
复制
"filter(?label, " + queryVar + "…"

您可能需要考虑使用ParameterizedSparqlString来安全地替换queryVar。否则,queryVar所发生的事情就像

代码语言:javascript
复制
"\"Batman\") UNION { ?film hasPassword ?label }"

然后它就被取代了?你突然泄露了一堆信息。即使没有任何敏感信息,您仍然可能导致SPARQL端点承受很大的负载,从而有效地发起拒绝服务攻击。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18721896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档