安装程序
考虑一下我有两个可执行程序的设计,foo和bar。假设两者都是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是“原子”,也就是说,每个原子只有一个。但他们可能会被部署好几次。我们如何更好地将原子信息与每个实例信息分离?最初,人们可能尝试“单一继承”;下面是两个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 .我并不感到惊讶,因为类型/子subClassOf机器并没有寻找一个名为exec的属性来发挥它的魔力。请注意,exec的特定值工作良好。
?s rdfs:subClassOf Instance ;
exec foo .但这当然过于严格/具体;我们不能说出每一个可能的软件。
问题
在这个空间中,有什么设计上的最佳实践可以使简单的事情变得简单(例如,“在180天内找到所有的SW原子,如果它产生了6个软件,我们就不想拖进这6个软件的12000个实例中)。”
发布于 2017-11-23 04:40:47
你的概念化是不正确的。对象要么是概念(类),要么是个人,它取决于知识库的粒度。在这种情况下,SW是一个类,foo和bar是SW的子类,foo_111和foo_222是foo类的个体。不要创建类实例。相反,使用rdf:type谓词实例化软件工具,并使用SPARQL过滤器中的rdfs:subclassOf谓词查找所有软件工具。如果需要查询实例,请使用datatype属性捕获唯一标识符,例如软件特定副本的条形码,并查询该属性的值。
https://stackoverflow.com/questions/47025002
复制相似问题