当前位置: 首页 > 知识库问答 >
问题:

如何用OWLAPI有效地计算不交点?

汪栋
2023-03-14
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个循环给出的,这些循环使应用程序变慢;此外,对本体的每一类都执行计算分离过程

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

共有1个答案

穆才良
2023-03-14

一个简单的优化是将ontology.getAxioms(AxiomType.disjoint_classes)移动到调用方法中,然后将其作为参数传入。这个方法在每次调用时都返回一个新的集合,每次都返回相同的内容,因为您没有修改本体。因此,如果您有N个类,您将创建至少N个相同的集合;如果许多类实际上是不相交的,则会更多。

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

优化3:跟踪你已经访问过的类。例如,如果你有

A disjointWith B

优化4:我不相信这段代码能可靠地告诉您哪些不相交的公理是推断出来的,哪些是断言出来的。您可以:

A disjointWith B
B disjointWith C

推理器将返回{A,B,C}以响应请求A的不相交。你会在一个不相交公理的签名中找到所有这三个元素,并发现推理者没有做任何推论。但是输入中的公理与输出中的公理并不相同(许多推理者实际上会对输入公理进行吸收,并将它们转换为一个内部表示,即一个具有三个操作数的公理)。所以,我对inferd和asserted的定义是,由推理器返回的节点集与一个不相交公理的操作数集相同。为了验证这个条件,我将使用所有不相交的公理,提取操作数集,并将这些集保留在一组集中。那么,

  • 对于每个类(并保持对每个类只访问一次的优化),
    • 获得不相交的节点集(这里的优化是为了不麻烦,如果集合中只有一个类),
    • 将其转换为一组实体,
    • 并检查前面创建的集合是否包含此新集合。如果是,这是一个断言的公理;如果不是,则为推断。

 类似资料:
  • 问题是:执行时间非常慢,我会说是永恒的。即使我减少了一些if语句的比较数,情况还是一样的。 Protege似乎非常快地计算出这些推断的公理,并且它基于我正在使用的相同API(OWLAPI)。那么,我是不是走错了路?

  • 我想计算一个二次形式:朱莉娅中的。 对于这种情况,最有效的计算方法是什么: 没有假设 是对称的 和是相同的() 和都是对称的 我知道朱莉娅有。但是我想知道它是否比BLAS呼叫更快。

  • 我试图改进大数的阶乘计算的运行时间。 第一个简单循环和乘法的代码。 此函数的分析结果: 对于n=1000--总时间:0.001115 s for n=10000--总时间:0.035327 s 对于n=100000——总时间:3.77454 s。 从n=100000的测线仪中,我可以看到大部分时间都花在乘法步骤上,即“98.8” 因此,试图将阶乘乘法减少一半,对于偶数,因此进行了强度减少。 后半部

  • 问题内容: 这是我目前的方式。有什么办法可以使用矩阵运算吗?X是数据点。 问题答案: 您是否要使用高斯核进行图像平滑?如果是这样,则scipy中有一个函数: 更新的答案 这应该可以工作- 尽管仍不能100%准确,但它会尝试考虑网格每个像元内的概率质量。我认为在每个像元的中点使用概率密度的准确性稍差,尤其是对于小内核。有关示例,请参见https://homepages.inf.ed.ac.uk/rb

  • 问题内容: 假设我有以下由四行三列组成的2D numpy数组: 生成包含所有列之和的一维数组的有效方法是什么(如)?无需遍历所有列就能做到这一点吗? 问题答案: 请查看的文档,特别注意该参数。汇总列: 或者,总结行: 其他聚合函数一样,并且,例如,也采取了参数。 从暂定NumPy的教程: 许多一元运算(例如计算数组中所有元素的总和)都作为该类的方法实现。默认情况下,这些操作适用于数组,就好像它是数

  • 所以有几个网站会为你计算你的链接本地ipv6地址,就像这里的这个。 尽管如此,它并没有给出任何有用的关于这个地址是如何计算的,也没有输入参数是什么。那么,如果一个人知道自己的ipv4地址、子网掩码和网关地址,计算链路本地ipv6地址的过程(或算法)是什么?我正在使用SCTP套接字做一个项目,该项目使用ISATAP网络隧道和LL ipv6地址用于构建ISATAP地址。