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

Posted

技术标签:

【中文标题】SPARQL 选择查询在 JENA 中返回意外结果【英文标题】:SPARQL select query returns unexpected results in JENA 【发布时间】:2012-11-02 13:01:30 【问题描述】:

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

我使用 Twinkle (http://www.ldodds.com/projects/twinkle/) 测试了一组查询并获得了所需的结果 - 但在 Jena 中实现它们时返回了额外的结果。

例如在闪烁中

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

returns 1 result in twinkle (ns:Contains),而当在我的程序中使用 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 耶拿 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

耶拿的结果:

(?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 的查询?

【问题讨论】:

如果没有指向您正在使用的数据集的指针,很难调试它。另外,您能否添加一个 println 以确保正在执行的查询是您所期望的? 正如 Alex 所说,没有数据就无法调试,我还注意到 Twinkle 非常过时(我相信它使用 ARQ 2.6.4 作为查询引擎),而 ARQ 的当前版本是2.9.4。这些版本之间的 SPARQL 规范(以及 ARQ)发生了很大变化。此外,您还没有展示如何创建数据,您是否可能在 Jena 代码中使用了 InferenceModel 来解释额外的结果。 感谢您的 cmets。使用的数据是从我自己的 .owl 文件派生的 OntModel。此外,该查询与在 TWINKLE 中尝试的查询相同。在处理了我程序的另一部分然后回到这个问题之后,问题似乎已经消失了。如果我发现发生了什么,我会发布答案。 【参考方案1】:

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

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

OntModel 获得的额外结果取决于您在创建模型时选择的规则集。

【讨论】:

是的,这似乎成功了。看起来我将不得不构建两个模型对象,因为我需要 OntModel 的推理能力来实现我希望合并的其他功能。 如果你有一个OntModel,你可以调用getBaseModel()来获取底层模型,即得到一个只包含非推断三元组的Model

以上是关于SPARQL 选择查询在 JENA 中返回意外结果的主要内容,如果未能解决你的问题,请参考以下文章

SPARQL查询集成python脚本及jena简介

搭建Jena Fuseki并执行SPARQL查询

java 使用Apache Jena的API(不是RESTful API)从RDF数据构建数据库并回答Java中的SPARQL查询

SPARQL 查询返回空结果集

Sparql查询RDF

SPARQL 查询根据语句的顺序返回不同的结果