【发布时间】:2019-01-24 17:25:41
【问题描述】:
我正在链接多个本体模型,所有模型都具有一个共享的基础模型,其中定义了所有类和关系。每个模型都是由不同的开发人员创建的,并且具有重叠的域。我需要检查以确保没有进行循环引用。例如 A 有一个孩子 B,B 有 C,然后,偶然地,C 有孩子 A。在我们的软件中可以做到这一点而不会出错。我已经编写了捕获 A 有子 B 并且同时 B 有子 A 的 SPARQL,但我不确定如何解决第一个问题。谢谢。
编辑: 我需要检测链接模型中的任何递归。因此,当链接多个本体时,在这个聚合模型中,可能会发生以下情况:
A
\
B
\
C
\
A
如果我有一个无限递归循环,这显然会在最终应用程序中产生问题。如果我最初不清楚,我很抱歉。
【问题讨论】:
-
什么是“概念”,什么是“孩子”?至少发布您的第一个查询...假设它看起来像
SELECT ?a ?b {?a :has_child ?b . ?b :has_child ?a}?似乎删除这两个圆圈后,您可以简单地写SELECT ?a ?b ?c {?a :has_child ?b . ?b :has_child ?c. ?c :has_child ?a}在删除之前,您应该添加类似FILTER (?a != ?c)的内容。或者您可能会涉及推理:使:has_child具有传递性和非自反性,然后检查一致性。 -
@StanislavKralin 我认为他在谈论 RDF 中的类层次结构,因此,
rdfs:subClassOf可能是要走的关系。 -
可以使用 SPARQL 1.1 属性路径
-
@StanislavKralin 是的,根据定义,它也是一个循环,但也许应该允许这种情况。但我们不知道他的用例或要求,也不知道“子”关系。我还确信属性路径可能无法针对具有深层层次结构的非常大的本体进行扩展。据我所知,如果可能的话,在 SPARQL 中检查周期是很昂贵的。图形数据库在这里提供了更好的支持,但如果数据很小,我会先选择属性路径。
-
@Davy M 感谢您的提醒。有人编辑了它,但不知道为什么。还是有点新在这里...赞赏。