SPARQL select查询在JENA中返回意外结果

时间:2012-11-02 13:01:30

标签: java sparql jena

我在研究项目中一直使用Jena,但是我最近一直在尝试使用SPARQL查询来帮助我的程序更有效地完成某些任务。

我使用Twinkle(http://www.ldodds.com/projects/twinkle/)测试了一组查询并获得了预期的结果 - 但是在Jena中实现它们时,会返回其他结果。

例如在Twinkle

SELECT ?x WHERE { ?x rdfs:domain ns:Area .  ?x rdfs:range ns:Structure }

在twinkle(ns:Contains)中返回1个结果,而在使用Jena在我的程序中运行时,它返回另一个属性(ns:testProperty),它不应该作为范围和域不匹配。我无法弄清楚为什么存在这种差异,任何指针都会受到赞赏。

我的Java代码如下:

Query q = sparqlQueryGetProperties(s, o);

QueryExecution qexec = QueryExecutionFactory.create(q, m);

try {
    Iterator<QuerySolution> rs = qexec.execSelect();

    for (; rs.hasNext();) {
        QuerySolution soln = rs.next();
        if(soln.contains("x")){
            RDFNode r = soln.get("x");

            Resource rss = r.asResource();

            props.add(rss.getLocalName());
        }
    }
} finally {
    qexec.close();
}

其他信息: Sparql v1.0 耶拿核心2.7.4 Jena ARQ 2.9.4

用于测试的完整查询:

PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>  
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
PREFIX ns:<http://www.semanticweb.org/ontologies/2012/1/Ontology1328444427428.owl#>   
PREFIX owl: <http://www.w3.org/2002/07/owl#> 

SELECT ?x WHERE { ?x rdfs:domain ns:Area .  ?x rdfs:range ns:Structure }

更新

不幸的是,我仍然从TWINKLE

中的测试用例中获得了额外的资源

以下是在Twinkle和Jena中运行的确切SPARQL查询:

PREFIX  rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX  ns:   <http://www.semanticweb.org/ontologies/2012/1/Ontology1328444427428.owl#>
PREFIX  owl:  <http://www.w3.org/2002/07/owl#>
PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT  ?prp ?x
WHERE
  { ns:cathedral  ?prp  ?x .
?x        rdf:type  owl:NamedIndividual .
FILTER ( ?prp != ns:hasShape )
}

结果在TWINKLE中:

?prp = ns:within ?x = ns:Campus

JENA的结果:

(?prp -> ?x)
sameAs -> cathedral
disjoin -> cathedral
differentFrom -> Cath_point_4  //This particular relationship seems completely random.
topObjectProperty -> cathedral
within -> Campus

以下是我正在使用的数据(这是我为测试而开发的本体论):

http://cgi.csc.liv.ac.uk/~roscminni/ontResources/spatialOntCopy.owl

是否有更好的测试查询的工具,Twinkle考虑到Twinkle似乎已过时?

1 个答案:

答案 0 :(得分:2)

不同之处在于,在您的Jena代码中,您使用OntModel而Twinkle仅使用普通Model

在Jena内部,Model上的SPARQL查询会转换为find()上的多个Model来电。 OntModel find()次调用将包括推断的三元组,因此会产生额外的结果。

使用OntModel获得的其他结果取决于您在创建模型时选择的规则集。