【问题标题】:RDFS: subClassOf, type, and "multiple inheritance."RDFS:subClassOf、类型和“多重继承”。
【发布时间】:2017-10-30 22:13:16
【问题描述】:

设置

考虑一个设计,我有 2 个可执行程序,foobar。假设两者都是SW 的子类,例如(为了清楚起见,删除了大多数前缀):

SW   rdf:type  rdfs:Class

foo   rdf:type  rdfs:Class
foo   rdfs:subClassOf  SW

bar   rdf:type  rdfs:Class
bar   rdfs:subClassOf  SW

使用 Jena 默认推理器的 SPARQLing 会执行预期的操作,例如,您可以请求 subClassOf SW 的所有内容并获取 foo 和 bar,并且您可以获得超类/子类的所有属性等。好的。将 foo 和 bar 视为“原子”;也就是说,他们每个人只有一个。但它们可以多次部署。我们如何将原子信息与每个实例信息很好地分离?最初,可以尝试“单一继承”;这是foo 的两个这样的实例:

foo_111  rdf:type  rdfs:Class
foo_111  rdfs:subClassOf  foo
foo_222  rdf:type  rdfs:Class
foo_222  rdfs:subClassOf  foo

现在的问题是,当我们要求我们所有的软件原子 (SW) 时,我们也会选择其中的实例,这不是我们想要的。可能以某种方式过滤掉实例。一种方法可能是使用“标记类”,有点像多重继承:

foo_111  rdf:type  rdfs:Class
foo_111  rdfs:subClassOf  foo
foo_111  rdfs:subClassOf  Instance
foo_222  rdf:type  rdfs:Class
foo_222  rdfs:subClassOf  foo
foo_222  rdfs:subClassOf  Instance

并且查询将过滤任何类型的实例。

让我们暂时继续探索。

另一种方法是让一个实例成为它自己的类,并有一个名为exec 的字段引用被激活为实例的事物:

Instance  rdf:type  rdfs:Class
foo_111  rdf:type  rdfs:Class
foo_111  rdfs:subClassOf  Instance
foo_111  exec             foo
foo_222  rdf:type  rdfs:Class
foo_222  rdfs:subClassOf  Instance
foo_222  exec             foo

这很整洁,因为它干净地将“原子”空间与“实例”空间分开,并且各种事物都可以成为实例。 但是:现在看来我的所有SW 都无法使用 SPARQL,例如

?s rdfs:subClassOf Instance ;
        exec       SW .

我并不感到惊讶,因为 type/subClassOf 机器并没有寻找名为 exec 的属性来发挥作用。请注意, exec 的特定值可以正常工作,例如

?s rdfs:subClassOf Instance ;
        exec       foo .

但这当然过于严格/具体;我们无法命名所有可能的软件。

问题

在这个领域是否有任何设计最佳实践可以让简单的事情变得简单(例如“找到所有在 180 天内 EOL 的 SW 原子”,如果它产生 6 个软件,我们不想拖入 12000这 6 个软件的实例)。

【问题讨论】:

  • 您是在用 foo_111 描述实际的个体,还是在描述第二级子类?显示的 RDF 的 sn-ps 表示子类,在这种情况下,您所追求的似乎是一种仅选择直接子类的方法;但是,如果您指的是个人,则 sn-ps 是错误的 - 应该有 rdf:type 而不是 rdfs:subClassOf
  • 我确实尝试过“foo_111 rdf:type foo”,但这会导致实例 (foo_111) 遇到原子 (foo) 查询的相同问题。换句话说,查找所有 SW 仍然会选择 foo_111。不过,你是对的; foo_111 不是 foo 的真正子类;它是它的一个实例。
  • 注:有了新的眼光和基于@Ignazio 的推动的更多实验,我相信我现在有了一个可行的解决方案。 foo_111 是 rdf:type 的 foo 也是 subClassOf 实例。我现在可以请求特定类型和超类型的实例或原子。

标签: object rdf semantic-web rdfs


【解决方案1】:

您的概念化不正确。一个对象要么是一个概念(类),要么是一个个体,它取决于您的知识库的粒度。在这种情况下,SW 是一个类,foo 和 bar 是 SW 的子类,而 foo_111 和 foo_222 是 foo 类的个体。不要创建类实例。相反,使用 rdf:type 谓词来实例化软件工具,并使用 SPARQL 过滤器中的 rdfs:subclassOf 谓词来查找所有软件工具。如果您需要查询实例,请使用数据类型属性来捕获唯一标识符,例如软件特定副本的条形码,并查询该属性的值。

【讨论】:

  • 是的,最后“实例”是多余的。
猜你喜欢
  • 2012-04-05
  • 2010-11-08
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多