我正在链接许多本体模型,所有本体模型都与定义了所有类和关系的共享基本模型连接。每个模型都是由不同的开发人员创建的,并且具有重叠的域。我需要检查以确保没有循环引用。例如,A的孩子为B,B的孩子为C,然后偶然地C的孩子为A。在我们的软件中有可能做到这一点而没有错误。我写的SPARQL捕获了A的孩子B,同时B的孩子A,但是我不确定如何解决第一个问题。谢谢。
编辑: 我需要检测链接模型中的任何递归。因此,在链接多个本体时,在此聚合模型中可能会发生以下情况:
A
\
B
\
C
\
A
如果我有一个无限的递归循环,这显然会在最终应用程序中引起问题。如果最初不清楚,我会道歉。
答案 0 :(得分:2)
SPARQL 1.1 Property Paths似乎是显而易见的解决方案。例如,对于类和子类,我会做-
SELECT DISTINCT ?selfParent
WHERE
{ ?selfParent rdfs:subClassOf+ ?selfParent }
注意: 在撰写本文时,Virtuoso的查询优化器中存在一个错误,该错误会阻止执行以上OneOrMorePath
({ {1}}个运算符)查询。您可以使用+
中与之等效的SequencePath
,后跟下面的One
(ZeroOrMorePath
运算符)来解决此问题:
SELECT DISTINCT ?selfParent WHERE { ?selfParent rdfs:subClassOf / rdfs:subClassOf* ?selfParent }
您还可以执行(和/或*
)深度不同的多个UNION
查询,如下所示。使用此方法,您可以在每个级别上指定不同的谓词。
SequencePath
如果您有多个谓词出现在某个级别,则可以将SELECT DISTINCT ?selfParent
WHERE
{ { ?selfParent rdfs:subClassOf ?selfParent }
UNION
{ ?selfParent rdfs:subClassOf /
rdfs:subClassOf ?selfParent }
UNION
{ ?selfParent rdfs:subClassOf /
rdfs:subClassOf /
rdfs:subClassOf ?selfParent }
}
的实例更改为rdfs:subClassOf
,如-
( rdfs:subClassOf | ex:myPredicate )
这些结果不会向您显示完整的路径,但是我想您可以从这里解决。