gpt4 book ai didi

java - SPARQL查询不检索java中的结果

转载 作者:行者123 更新时间:2023-12-02 03:28:21 25 4
gpt4 key购买 nike

嗨, friend 们,抱歉,我问的问题与我之前的问题类似。我已在 SPARQL Web 服务中运行代码 [ http://drugbank.bio2rdf.org/sparql]返回结果如下:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX drugbank: <http://www4.wiwiss.fu-berlin.de/drugbank/resource/drugbank/>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT distinct ?resource WHERE { ?resource dcterms:identifier "drugbank:DB01051"^^xsd:string}

但是,我尝试在 java 中获取结果,但它不会返回具有相同查询的结果。 java代码如下:

import java.io.IOException;
import org.apache.jena.query.ParameterizedSparqlString;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.ResultSetFactory;
import org.apache.jena.query.ResultSetFormatter;
import org.apache.jena.query.ResultSetRewindable;

public class DrugbankResourceProperty {

public static void main(String[] args) throws IOException {

ParameterizedSparqlString pss = new ParameterizedSparqlString(""
+ "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
+ "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n"
+ "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n"
+ "PREFIX dcterms: <http://purl.org/dc/terms/>\n"
+ "PREFIX drugbank: <http://www4.wiwiss.fu-berlin.de/drugbank/resource/drugbank/>"
+ "\n"
+ "SELECT distinct ?resource WHERE { ?resource dcterms:identifier \"drugbank:DB01051\"^^xsd:string}");

QueryExecution exec = QueryExecutionFactory.sparqlService("http://drugbank.bio2rdf.org/sparql", pss.asQuery());

ResultSetRewindable results = ResultSetFactory.makeRewindable(exec.execSelect());

while (results.hasNext()) {

System.out.println(ResultSetFormatter.asText(results));
}

}

}

我在第一次运行后添加了“xsd”和“drugbank”前缀,并认为由于这些缺少前缀而不会返回。但是,此后它不再起作用。我真的不知道为什么它不返回结果。如果可能的话你能告诉我哪里出错了吗?非常感谢您的帮助!

最佳答案

问题是自 Jena 3.x 以来的 RDF 1.1。在 RDF 1.1 中,字符串文字的语义和处理方式发生了变化。因此,查询将被解析为

   PREFIX  drugbank: <http://www4.wiwiss.fu-berlin.de/drugbank/resource/drugbank/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT DISTINCT ?resource
WHERE
{ ?resource dcterms:identifier "drugbank:DB01051" }

查看文字中缺少的数据类型。但是,问题在于,SPARQL 端点不适用于新的 RDF 1.1 语义,并将文字作为普通文字处理,这实际上与 xsd:string 文字不匹配。

我不知道 JENA 中是否有配置选项,但您可能应该在邮件列表中询问它,然后在此处发布答案。

我看到的唯一解决方法是使用QueryEngineHTTP,它可以避免内部解析,例如

QueryEngineHTTP qe = new QueryEngineHTTP("http://drugbank.bio2rdf.org/sparql", pss.toString());
System.out.println(ResultSetFormatter.asText(qe.execSelect()));
qe.close();

更新

根据 @RobV 下面的评论,更改 Apache JENA ( javadoc ) 中旧行为的配置选项是:

JenaRuntime.isRDF11 = false;

关于java - SPARQL查询不检索java中的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38470944/

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