如何在我的本体 O 所有(推断的)存在限制中检索每个类?
我目前的方法是迭代所有类和对象属性对,并检查是否满足限制:
- 对于类(O)×类(O)中的每个子类(C,D):
- 为对象属性(O)中定义的每个属性 P :
- 如果 C 且 P 某些 D 可以满足:
- yield (C,P,D)
当我使用具有4557个类和107个对象属性的vaccine ontology时,这非常慢。即使是一次性计算,我也可以从看到更好的方法中学到一些东西。
使用JFact中的OWLKnowledgeExplorerReasoner
建议here无法正常工作,因为它在检索邻居标签时崩溃了(请参阅我的test case)
您能否使用OWLAPI,Protégé或任何其他工具建议任何改进的解决方案?此外,最好只检索最具体的填充类。
谢谢!
答案 0 :(得分:2)
首先,你的检查是错误的。对于一个空的本体C and P some D
是可以满足的,这不是你想要的。您必须检查C and not (P some D)
是否不可满足(或者,您只需检查isSubsumedBy(C, P some D)
)。
如果您使用某些用于分类的技术,则可以缩短探索时间,例如:
C
是P some D
的子类,那么C
C
不是P some D
的子类,那么C
P
和D
P some Thing
表达式指定名称。分类后,您可以将C
的搜索限制为仅限于这些概念的子类。如果您可以缩小问题范围,也会有所帮助。你真的需要检查所有对和所有属性吗?
如此处所建议的那样使用JFact的OWLKnowledgeExplorerReasoner不起作用,因为它在检索邻居标签时崩溃了(异常无法访问的情况!)。
你能提供一个测试用例和问题的完整堆栈跟踪,以便我们解决它吗?您是否尝试过使用FaCT ++?