RDFS:subClassOf,type和"多重继承。"

时间:2017-10-30 22:13:17

标签: object rdf semantic-web rdfs

设置

考虑一个设计,我有一个2个可执行程序,foobar。假设两者都是subClassOf 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是" atoms&#34 ;;也就是说,每个人只有一个。但它们可以多次部署。我们如何将原子信息与每个实例信息进行良好隔离?最初,人们可能会尝试单一继承&#34 ;;这是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

并且查询将过滤Instance类型的任何内容。

让我们继续探索。

另一种方法是让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的SPECIFIC值工作正常,例如

?s rdfs:subClassOf Instance ;
        exec       foo .

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

问题

在这个空间中是否有任何设计最佳实践可以使简单的事情变得简单(例如"在180天内找到EOL的所有SW原子"如果它产生了6个软件,我们就不会这样做。我想拖动这6个软件的12000个实例)。

1 个答案:

答案 0 :(得分:1)

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