我正在分析基于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。
是否有更有效的方法来获得不相交性并检查公理是否被断言或派生?
第二优化:检查不相交节点集的大小。大小1表示没有相交,因此您可以跳过该方法的其余部分。
优化3:跟踪您已经访问过的课程。例如,如果您有A disjointWith B
您的代码将在A
上调用,并在A
和B
上循环,然后在B
上调用并重复计算。保留一组访问的类,在这些类中添加不相交节点集中的所有元素,当B
轮到时,您也可以跳过推理程序调用。说到这一点,我认为推理程序调用实际上是此方法中最昂贵的调用。您是否有其他描述的数据?
优化4:我不认为此代码可以可靠地告诉您推断出哪些不相交的公理,以及哪些断言了。您可能有:
A disjointWith B B disjointWith C
推理机将响应请求{A, B, C}
的脱节而返回A
。您将在一个不相交的公理的签名中找到所有这三个元素,并发现推理机没有做任何推断。但是输入中的公理与输出中的公理不同(实际上,许多推理程序会吸收输入公理,并将其转换为具有三个操作数的内部公理)。因此,我对推断和断言的定义将是推理机返回的节点集与一个不相交公理的操作数集相同。为了验证这种情况,我将采用所有不相交的公理,提取操作数集并将这些集保留在一组集中。然后,
对于每个班级(并保持优化以仅访问每个班级一次,