【问题标题】:How To Check To See If A Concept Is A Child Of Itself如何检查一个概念是否是它自己的孩子
【发布时间】: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 感谢您的提醒。有人编辑了它,但不知道为什么。还是有点新在这里...赞赏。

标签: sparql rdf ontology


【解决方案1】:

SPARQL 1.1 Property Paths 似乎是显而易见的解决方案,如果您知道涉及哪些谓词。例如,对于类和子类,我会做类似 --

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

注意: 在撰写本文时,Virtuoso 的查询优化器中存在一个错误,该错误会阻止执行上述 OneOrMorePath+ 运算符)查询.您可以使用等效的 SequencePathOne 后跟 ZeroOrMorePath* 运算符)来解决此问题:

SELECT DISTINCT ?selfParent
在哪里
  { ?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 ),如--

SELECT DISTINCT ?selfParent
WHERE 
  { { ?selfParent rdfs:subClassOf ?selfParent }
    UNION
    { ?selfParent rdfs:subClassOf / 
                  rdfs:subClassOf ?selfParent }
    UNION
    { ?selfParent rdfs:subClassOf / 
                  ( rdfs:subClassOf | ex:myPredicate ) / 
                  rdfs:subClassOf ?selfParent }
  }

这些结果不会向您显示完整的路径,但我想您可以从这里计算出来。

【讨论】:

    猜你喜欢
    • 2018-08-07
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2017-03-19
    • 2017-10-24
    • 2016-11-12
    相关资源
    最近更新 更多