我对SPARQL查询的结果有疑问
相同的查询在Protege和Jena之间提供了不同的结果
在Protege中,查询为:
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?subject
WHERE { ?subject rdfs:label ?object}
结果是:字符串(症状的标签)
在耶拿,代码:
String path = "file:///D:/onto/owl ontologies/symp.owl";
OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM);
String stringQuery
= "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> "
+ "SELECT ?symptoms "
+ " WHERE { ?symptoms rdfs:label ?object }";
Query query = QueryFactory.create(stringQuery);
QueryExecution executeQuery = QueryExecutionFactory.create(query,model);
org.apache.jena.query.ResultSet res = executeQuery.execSelect();
model.read(path);
while (res.hasNext()) {
QuerySolution qs = res.nextSolution();
Resource symp = qs.getResource("symptoms");
System.out.println(symp);
}
结果是:URI
使用的本体:http://purl.obolibrary.org/obo/symp.owl
如何才能获得标签&#34;症状&#34; 谢谢你的帮助。
答案 0 :(得分:4)
您必须在查询中选择对象而不是主题:
PREFIX rdfs: http://www.w3.org/2000/01/rdf-schema#
SELECT ?label WHERE { ?symptoms rdfs:label ?label}
一般来说,给出变量&#34;更好&#34;名字可以避免像你这样的问题。
然后你必须在Java代码中获得文字的词法形式:
while (res.hasNext()) {
QuerySolution qs = res.next();
String symp = qs.getLiteral("label").getLexicalForm();
System.out.println(symp);
}
即使您的查询,Protege为您显示一些人类可读形式的原因是在UI中设置了默认渲染器。使用URI中的short或rdfs:label
或某些自定义呈现的东西。