如何有效地计算OWLAPI的不相交性?

问题描述 投票:1回答:1

我正在分析基于OWLAPI的应用程序,发现的唯一瓶颈是关于计算[[disjointness。我必须检查每个类是否与其他类不相交,并且是否为asserted或inferred

计算似乎很繁琐,因为与基于

Node

数据结构的等效性不同(并且有效地检索数据),不相交性基于此[我被迫执行更多循环的方式。这是我使用的过程:private void computeDisjointness(OWLClass clazz) { NodeSet<OWLClass> disjointSetsFromCls = reasoner.getDisjointClasses(clazz); for (Node<OWLClass> singleDisjoinSet : disjointSetsFromCls) { for (OWLClass item : singleDisjoinSet) { for (OWLDisjointClassesAxiom disjAxiom : ontology.getAxioms(AxiomType.DISJOINT_CLASSES)) { if(disjAxiom.containsEntityInSignature(item)) { //asserted } else { //derived } } } } 如您所见,瓶颈由3个for循环给定,这会降低应用程序的速度;此外,对本体的每个类执行过程
computeDisjointness

是否有更有效的方法来获得不相交性并检查公理是否被断言或派生?

owl owl-api
1个回答
0
投票
至少 N个相同的集合;如果许多类实际上是不相交的,则更多。

第二优化:检查不相交节点集的大小。大小1表示没有相交,因此您可以跳过该方法的其余部分。

优化3:跟踪您已经访问过的课程。例如,如果您有

A disjointWith B

您的代码将在A上调用,并在AB上循环,然后在B上调用并重复计算。保留一组访问的类,在这些类中添加不相交节点集中的所有元素,当B轮到时,您也可以跳过推理程序调用。说到这一点,我认为推理程序调用实际上是此方法中最昂贵的调用。您是否有其他描述的数据?

优化4:我不认为此代码可以可靠地告诉您推断出哪些不相交的公理,以及哪些断言了。您可能有:

A disjointWith B B disjointWith C

推理机将响应请求{A, B, C}的脱节而返回A。您将在一个不相交的公理的签名中找到所有这三个元素,并发现推理机没有做任何推断。但是输入中的公理与输出中的公理不同(实际上,许多推理程序会吸收输入公理,并将其转换为具有三个操作数的内部公理)。因此,我对推断和断言的定义将是推理机返回的节点集与一个不相交公理的操作数集相同。为了验证这种情况,我将采用所有不相交的公理,提取操作数集并将这些集保留在一组集中。然后,

对于每个班级(并保持优化以仅访问每个班级一次,

  • 获取不相交节点的集合(如果在该集合中只有一个类,可以进行优化以免打扰),>>
      将其转换为一组实体,
  • 并检查先前创建的集合集是否包含此新集合。如果是,则这是断言的公理;如果不是,则进行推断。
© www.soinside.com 2019 - 2024. All rights reserved.