jena语法

时间:2017-04-24 19:17:00

标签: sparql jena protege

我对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; 谢谢你的帮助。

1 个答案:

答案 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或某些自定义呈现的东西。