首页 文章

从ResultSet中的资源获取URI

提问于
浏览
0

我试图从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 回答

  • 2

    documentation for QuerySolution#getResource

    Resource getResource(String varName)返回此绑定中命名变量的值,并转换为Resource . 返回null表示该解决方案中不存在该变量 . 异常表示它存在但不是资源 .

    如果您收到 null ,则查询解决方案中不存在某些值 . 但是,如果没有看到您的实际查询,'s impossible to tell whether you'由于某种原因(例如, 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> |
    -----------------------------------------------------------------------------------------
    

    其中 labelfilm 始终绑定 . 所有标签都是文字,所以你应该能够做到

    qs.getLiteral("label")
    

    得到一个文字 . 这听起来更像是你想要的 film 变量的URI

    qs.getResource("film").getURI()
    

    当然,如果你想要URI字符串,你可以使用 toString() .

    抛开而不是做

    "filter(?label, " + queryVar + "…"
    

    你可能想考虑使用ParameterizedSparqlString安全地替换queryVar . 否则, queryVar 会发生什么

    "\"Batman\") UNION { ?film hasPassword ?label }"
    

    它被取代了吗?你突然泄漏了一堆信息 . 即使没有任何敏感信息泄露,您仍然可能最终导致SPARQL endpoints 出现大量负载,从而有效地启动拒绝服务攻击 .

相关问题