【发布时间】:2017-10-30 22:13:16
【问题描述】:
设置
考虑一个设计,我有 2 个可执行程序,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 默认推理器的 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