我尝试使用 protege 5 处理基于线的数据并绘制曲线的类似“区域”。
所以我有一条曲线,它在我的本体中被解构为等长度的部分(类Portion,实例p_1,...,p_n)。这些部分由其起点和终点 (point_1, ... ,point_n+1) 定义,此外,曲线的半径作为实例的数据属性存储在本体中 (>p_1,...,p_n)。我设法推理出不同部分之间的邻接关系
hasStartPoint(p_2,point_2) o isEndpointOf(point_2,p_1) => isNextOf(p_2, p_1)
hasEndPoint(p_1,point_2) o isStartpointOf(point_2,p_2) => hasNext(p_1, p_2)
我还设法创建定义的类,存储具有相同半径的部分。
所以这是我的问题:我想推理部分集(区域),它们相邻并且共享相同的曲线半径>。然后,应该为 i 个不同半径和非相邻集合、个体(region1, ... ,regioni)创建 i 个类 Set 的实例。
这是我要处理的示例数据:data I want to process
换句话说:如果一个半径在给定线上出现两次,并且该半径的部分不相邻,则它们不应该属于同一区域。此外,在添加不同半径的部分时应自动创建区域。我唯一的想法是,以某种方式在 isNext 三元组上循环遍历这组部分,我猜这需要一些编码,但我在这里找不到类似的东西......
我希望我的问题很清楚,如果有人对此有想法,我很乐意阅读。
提前谢谢
朱利安
最佳答案
从 owl-api 标签,我推断您正在寻找编写使用 OWL API 的代码来实现您的目标(您没有提到您在 Protege 中使用哪个推理器 - 您需要使用在代码中使用相同的推理器来推断诸如 hasNext
关系之类的东西)。
在 OWL API 中,我会执行以下操作:
- 推断
hasNext
三元组(如果它们尚未存储在本体文件中) - 对于每个定义的以相同半径分隔实例的类
- 检索该类别的所有个体
- 使用
hasNext
检索所有属性断言 - 将这些实例聚合到区域中 - 例如,为每个属性断言播种一个区域,然后如果两个区域的实例都属于同一定义的类并且一个区域中的端点是另一个区域中的起点,则合并两个区域。重复这一过程,直到定义的类只剩下一个区域(我相信,根据您的问题描述,该区域不能跨越具有相同半径的实例之外),或者直到不再发生合并。
就 OWLAPI 实现而言,一旦将本体加载到 OWLOntology
对象中,您就可以使用 OWLReasonerFactory
创建一个 OWLReasoner
可供您选择的推理机使用的实现(OWLAPI wiki 中存在这样的示例),那么有许多方法可以派上用场:
(此处引用 OWLAPI 4,因为这是 Protege 使用的)
- 获取类的所有个体:OWLOntology::getClassAssertionAxioms(OWLClassExpression) 给出声明个体属于某个类的所有公理,对于检索已定义类的实例很有用。通过 OWLReasoner,您可以使用 OWLReasoner::getInstances(OWLClass)
- 获取个体的所有对象属性断言:OWLOntology::getObjectPropertyAssertionAxioms(OWLIndividual)。对于获取
hasNext
值很有用。通过推理器,这将是 OWLReasoner::getObjectPropertyValues(OWLNamedIndividual, OWLObjectPropertyExpression)
我相信算法的其余部分可以在没有 OWLAPI 特定代码的情况下实现。
关于sparql - Protégé 5 中具有相同数据属性的相邻线部分的区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62594564/