Object RDFS:子类、类型和“多重继承”

Object RDFS:子类、类型和“多重继承”,object,rdf,semantic-web,rdfs,Object,Rdf,Semantic Web,Rdfs,设置 考虑一个设计,其中我有两个可执行程序,foo和bar。假设两者都是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 default reasoner进行SPARQLing可以完成预期的任务,因此您可以,例如,

设置

考虑一个设计,其中我有两个可执行程序,foo和bar。假设两者都是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 default reasoner进行SPARQLing可以完成预期的任务,因此您可以,例如,请求Subassof SW的所有内容并获取foo和bar,您可以获取超级/子类的所有属性,等等。确定。把Fo和bar看作原子;也就是说,它们每一个都只有一个。但它们可以部署多次。我们如何很好地将atom信息与每个实例信息分开?最初,可以尝试单一继承;以下是foo的两个实例:

现在的问题是,当我们要求所有的软件时,我们也会选择那些我们不想要的实例。也许可以通过某种方式过滤掉实例。一种方法可能是使用标记类,有点像多重继承:

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
这是整洁的,因为它干净地将原子空间与实例空间分开,并且各种各样的东西都可以成为实例。但是:现在看来我不能为我所有的软件SPARQL,例如

我并不感到惊讶,因为机器的类型/子类并不是在寻找一个名为exec的属性来发挥作用。请注意,exec的特定值可以正常工作,例如

?s rdfs:subClassOf Instance ;
        exec       foo .
但这当然过于严格/具体;我们不能说出所有可能的软件

问题


在这个领域是否有任何设计最佳实践可以使简单的事情变得简单,例如,找到所有在180天内下线的软件原子,如果它产生了6个软件,我们不想拖拽这6个软件的12000个实例

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

您是用foo_111描述实际的个人,还是描述第二级子类?显示的RDF片段表示子类,在这种情况下,您所追求的似乎只是选择直接子类的一种方式;但是,如果您指的是个人,那么代码段是错误的-应该是rdf:type而不是rdfs:subassofi尝试了foo_111 rdf:type foo,但这导致了相同的问题,即实例foo_111被原子foo的查询所捕获。换言之,寻找所有软件仍然会选择foo_111。不过,你是对的;foo_111不是foo的真正子类;这就是一个例子。注意:通过对@Ignazio的轻推,我相信我现在有了一个有效的解决方案。foo_111是一个rdf:foo的类型,但也是实例的子类。我现在可以要求特定类型和超类型的实例或原子。是的,最终实例是多余的。
?s rdfs:subClassOf Instance ;
        exec       SW .
?s rdfs:subClassOf Instance ;
        exec       foo .