gpt4 book ai didi

java - 从 ResultSet 中的资源获取 URI

转载 作者:行者123 更新时间:2023-12-02 06:45:14 25 4
gpt4 key购买 nike

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

for ( ; rs.hasNext() ; ) {
QuerySolution qs = rs.next();
System.out.println( qs.getLiteral("label"));
System.out.println( qs.getResource("label"));

文字返回得很好,我什至尝试了资源“?film”,但资源仍然为空。这是我的 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 . " + " }" + "";

See closely at ?film and where, they become filmwhere, thats the problem.

感谢约书亚,我明白了。

最佳答案

documentation for QuerySolution#getResource

Resource getResource(String varName)

Return the value of the named variable in this binding, casting to a Resource. A return of null indicates that the variable is not present in this solution. An exception indicates it was present but not a resource.

如果您得到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> |
-----------------------------------------------------------------------------------------

其中labelfilm总是绑定(bind)的。所有标签都是文字,所以你应该能够做到

qs.getLiteral("label")

并得到一个文字。听起来更像是您想要 film 变量的 URI,您可以使用

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

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

顺便说一句,而不是做

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

您可能需要考虑使用 ParameterizedSparqlString安全地替换 queryVar。否则,queryVar 会发生类似

的情况
"\"Batman\") UNION { ?film hasPassword ?label }"

它被替换为?你突然泄露了一堆信息。即使没有任何敏感信息泄露,您仍然可能最终在 SPARQL 端点上造成很大的负载,从而有效地发起拒绝服务攻击。

关于java - 从 ResultSet 中的资源获取 URI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18721896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com