设置
考虑一个设计,我有一个2个可执行程序,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是" 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个实例)。
答案 0 :(得分:1)
您的概念化不正确。对象是概念(类)或个人,它取决于知识库的粒度。在这种情况下,SW是一个类,foo和bar是SW的子类,而foo_111和foo_222是foo类的个体。不要创建类Instance。相反,使用rdf:type谓词来实例化软件工具,并使用SPARQL过滤器中的rdfs:subclassOf谓词来查找所有软件工具。如果需要查询实例,请使用数据类型属性捕获唯一标识符,例如软件特定副本的条形码,并查询该属性的值。