【问题标题】:Pellet internalReasonerException in OWL APIOWL API 中的 Pellet internalReasonerException
【发布时间】:2016-01-21 09:57:35
【问题描述】:

有一天被困住了,有人会好心帮忙吗? 我已经加载了一个导入 SWEET(地球和环境本体的语义网)的本体。我对其进行了一些 SPARQL 查询,得到了这样的答案:“对象属性 hasLowerBound 与 hasValue 限制一起使用,其中值是文字:“0”^^integer”。 (我在SWEET中查过的hasLowerBound是SWEET中的Datatype Ontology)

我该如何解决这个问题?

这是我写的代码和我得到的错误,非常感谢你的帮助~

public class load {
public static void main(String[] args) throws OWLOntologyCreationException {
    // Get hold of an ontology manager
    OWLOntologyManager manager = OWLManager.createOWLOntologyManager();

    File file = new File("G:/Protege/owlfiles/Before_Gather.owl");
            // Load the local copy
    OWLOntology loadMODIS = manager.loadOntologyFromOntologyDocument(file);

    PelletReasoner reasoner = 
    PelletReasonerFactory.getInstance().createNonBufferingReasoner( loadMODIS         
    );

    KnowledgeBase kb = reasoner.getKB();
    PelletInfGraph graph = new 
    org.mindswap.pellet.jena.PelletReasoner().bind( kb );
    InfModel model = ModelFactory.createInfModel( graph );

    String PREFIX = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-
    ns#>" +
            "PREFIX owl: <http://www.w3.org/2002/07/owl#>" +
            "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>" +
            "PREFIX seaice: <http://www.semanticweb.org/SeaIceOntology#>" +
            "PREFIX repr: <http://sweet.jpl.nasa.gov/2.3/reprDataFormat.owl#>" +
            "PREFIX realmCryo: <http://sweet.jpl.nasa.gov/2.3/realmCryo.owl#>" +
            "PREFIX relaMath: <http://sweet.jpl.nasa.gov/2.3/relaMath.owl#>";
    String SELECT = "select ?dataset ";
    String WHERE = "where {" +
            "?dataset relaMath:hasLowerBound " + "\"0\"^^xsd:integer" +
            "}" ;

    QueryExecution qe = SparqlDLExecutionFactory.create(QueryFactory.create(PREFIX + SELECT + WHERE), model);
    ResultSet rs = qe.execSelect();
    ResultSetFormatter.out(System.out,rs);
    rs = null;  qe.close();

    reasoner.dispose();

    //OWLReasonerSPARQLEngine sparqlEngine=new OWLReasonerSPARQLEngine(new MinimalPrintingMonitor());
    //sparqlEngine.execQuery(str.toString(),dataset);

    System.out.println("Loaded ontology: " + loadMODIS);
}
}

线程“main”中的异常 org.mindswap.pellet.exceptions.InternalReasonerException:对象属性 hasLowerBound 与 hasValue 限制一起使用,其中值是文字:“0”^^integer 在 org.mindswap.pellet.tableau.completion.rule.SomeValuesRule.applySomeValuesRule(SomeValuesRule.java:204) 在 org.mindswap.pellet.tableau.completion.rule.SomeValuesRule.apply(SomeValuesRule.java:64) 在 org.mindswap.pellet.tableau.completion.rule.AbstractTableauRule.apply(AbstractTableauRule.java:64) 在 org.mindswap.pellet.tableau.completion.SROIQStrategy.complete(SROIQStrategy.java:157) 在 org.mindswap.pellet.ABox.isConsistent(ABox.java:1423) 在 org.mindswap.pellet.ABox.isConsistent(ABox.java:1260) 在 org.mindswap.pellet.KnowledgeBase.consistency(KnowledgeBase.java:1987) 在 org.mindswap.pellet.KnowledgeBase.isConsistent(KnowledgeBase.java:2061) 在 org.mindswap.pellet.jena.PelletInfGraph.prepare(PelletInfGraph.java:258) 在 org.mindswap.pellet.jena.PelletInfGraph.prepare(PelletInfGraph.java:241) 在 com.clarkparsia.pellet.sparqldl.jena.SparqlDLExecutionFactory.create(SparqlDLExecutionFactory.java:113) 在 com.clarkparsia.pellet.sparqldl.jena.SparqlDLExecutionFactory.create(SparqlDLExecutionFactory.java:261) 在 com.clarkparsia.pellet.sparqldl.jena.SparqlDLExecutionFactory.create(SparqlDLExecutionFactory.java:226) 在 loadMODIS.load.main(load.java:78)

【问题讨论】:

  • 由于某种原因,属性 hasLowerBound 被作为对象属性处理,因此您必须检查本体中的问题。可能是本体错误或在 OWL API 解析步骤中发生了某些事情。
  • 非常感谢您的回答。起初我以为我加载的本体 SWEET 是错误的。但是它是正式发布的,我在本体里面查了一下,似乎他们是对的。属性 hasLowerBound 是一个 DataProperty。所以我现在正在考虑你说的第二种选择。但是我怎样才能查看解析步骤呢?你能给我一些建议吗?
  • 我建议在 OWL API 邮件列表上寻求帮助。那些家伙速度很快,通常可以很好地帮助你。如果该属性被明确定义为 owl:DatatypeProperty,则其他东西(例如另一个公理)必须让 Pellet 认为它是一个 owl:ObjectProperty。它也可能发生在从 OWL API 到 Pellet 内部结构的转换中。
  • Pellet 和 OWLAPI 的哪个版本?另外,你能添加一个到本体的链接吗?
  • 听起来是个好主意!我会去邮件列表寻求帮助。从 OWL API 到 Pellet 内部结构的转换过程中发生错误的可能性很大。非常感谢您的好建议~

标签: sparql ontology owl-api pellet


【解决方案1】:

hasLowerBound 被解析为数据属性和注释属性。

Pellet 正在检查数据属性情况,并假定如果属性不是数据属性,则它必须是对象属性。 OWL 2 本体总是如此,但该本体并未被解析为与 OWL 2 兼容的本体 - 不允许对注释属性和数据属性进行双关。

我还不确定问题出在本体还是在它的 OWLAPI 解析中。

编辑:这是一个解析问题。 hasLowerBoundrelaMath.owl 中声明为数据属性。但是relaMath.owl 导入reprMath.owl,它使用hasLowerBound 但没有声明它。 reprMath.owl 导入relaMath.owl,所以那里有一个循环导入。

问题在于,在解析过程中: - relaMath.owl 解析,找到导入,reprMath.owl 导入解析;尚未解析任何声明。 - 解析reprMath.owl,找到导入。 relaMath.owl 已经被解析,所以 call 什么也不做。 relaMath.owl 中声明的所有实体都包含在解析 reprMath.owl 时。问题:实体还没有被解析,所以这个集合是空的。 hasLowerBound 在 reprMath 中找到,但还没有声明。因此 OWLAPI 默认为 AnnotationProperty。 - relaMath.owl 解析继续,找到声明。

最终结果:任何导入relaMath.owl 的本体对hasLowerBound 都有非法双关。 OWLAPI 错误。

解决方法:将数据属性声明添加到reprMath.owl

<owl:DatatypeProperty rdf:about="#hasLowerBound"/>

这可能需要在多个本体中完成。

【讨论】:

  • 感谢您的建议!我不知道 Annotation Property 不能同时是 Datatype Property。但我不明白你的解决方案。是否意味着声明一个新的数据类型属性仅存在于特定文档中,而不是引用已经在 relaMath.owl 中声明的属性?我尝试在所有文档中删除所有 hasLowerBound 的 Annotation 声明,因为我认为文档会自动在 relaMath.owl 中找到 hasLowerBound 属性。但它仍然不起作用。我错了吗?
  • relaMath.owl /should/ 中的声明会被自动找到,但它不是——这就是错误。解决方法不是删除注解属性声明(没有),而是将数据属性声明添加到所有使用hasLowerBound的本体
  • 哦,对不起,我误会你了。本体relaMath包括repr、reprMath、PropFunction、reprMathGraph、propDifference、reprMathFunction、reprMathOperation、reprMathStatistics,其中只有reprMath导入relaMath导致循环。所以我只在 repeMath.owl 中添加了 并将命名空间“mrela”更改为“math”。它仍然无法正常工作。我是否应该更改其他 owl 文档,例如 matrWater,其中 relaMath.owl 不包含但 matrWater 本身包含 relaMath?
  • 我没有尝试将修复应用到所有本体,因此您可能必须尝试将声明添加到所有本体,以便问题消失。此外,该属性用于整数和双精度 - 这可能会导致合法错误,但我没有调查这种可能性。
  • 太感谢你了。我解决了问题。这是我根据您所说的所做的: 1.将 0 更改为 0.0;所有文档中的 00.0。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
相关资源
最近更新 更多