如何检查以查看概念是否本身就是一个孩子

时间:2018-08-17 16:08:44

标签: sparql rdf ontology

我正在链接许多本体模型,所有本体模型都与定义了所有类和关系的共享基本模型连接。每个模型都是由不同的开发人员创建的,并且具有重叠的域。我需要检查以确保没有循环引用。例如,A的孩子为B,B的孩子为C,然后偶然地C的孩子为A。在我们的软件中有可能做到这一点而没有错误。我写的SPARQL捕获了A的孩子B,同时B的孩子A,但是我不确定如何解决第一个问题。谢谢。

编辑: 我需要检测链接模型中的任何递归。因此,在链接多个本体时,在此聚合模型中可能会发生以下情况:

A
 \
  B
   \
    C
     \
      A

如果我有一个无限的递归循环,这显然会在最终应用程序中引起问题。如果最初不清楚,我会道歉。

1 个答案:

答案 0 :(得分:2)

如果您知道涉及哪些谓词,

SPARQL 1.1 Property Paths似乎是显而易见的解决方案。例如,对于类和子类,我会做-

SELECT DISTINCT ?selfParent
WHERE 
  { ?selfParent rdfs:subClassOf+ ?selfParent }

注意: 在撰写本文时,Virtuoso的查询优化器中存在一个错误,该错误会阻止执行以上OneOrMorePath({ {1}}个运算符)查询。您可以使用+中与之等效的SequencePath,后跟下面的OneZeroOrMorePath运算符)来解决此问题:

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 )

这些结果不会向您显示完整的路径,但是我想您可以从这里解决。