我有一个有点奇怪的查询,它一直在困扰我。我有一个应用程序,我需要动态生成子概念(owl:subClassOf)并将它们存储在数据集中,以便可以动态地实例化个体。下面的代码片段生成一个名为“Arduino”的新概念,它是另一个本体概念的子类。
datafeed:Arduino rdfs:subClassOf ssn:System.
我尝试使用JENA将其插入到我的TDB数据存储区中。我没有错,但我不确定这是否正确。我们可以将子类插入数据存储区,还是只能包含个体(即类的实例)的数据存储区?对于这个问题,我似乎在脑子里四处奔走。我尝试了各种SPARQL查询,但如果上面的三元组存储在数据集中,我似乎无法解决。我尝试了以下查询,以查看该概念是否存储在数据集中,但它没有返回任何结果:
SELECT ?concept
WHERE {
?concept a owl:Class.
}
这让我相信结果只会返回给个人,而不是类别定义......?
我脑子里有点混乱。如果有人能够纠正我的理解,那就太棒了。
祝你好运
答案 0 :(得分:3)
耶拿(或者我所知道的任何三重商店)都存储了你添加到它的所有三元组。你的三元组是否涉及rdfs:subClassOf
关系没有任何区别。
是否对您存储的数据执行任何形式的推理是另一回事。这取决于您使用的工具和您选择的配置。您执行的查询假设已经进行了某种形式的推理:datafeed:Arduino
如果您启用了推理,则owl:Class
三元组的插入只会是rdfs:subClassOf
(并且即便如此,它默认只会推断它是rdfs:Class
的实例,不一定是owl:Class
。)
在不依赖于推理的情况下测试插入三元组的一种万无一失的方法是实际查询特定的三元组,而不是隐含的后果,如下所示:
SELECT ?concept
WHERE { ?concept rdfs:subClassOf ssn:System . }
这将返回作为ssn:System
的子类的所有概念 - 如果您的三元组被正确插入,datafeed:Arduino
将出现在结果中。
或者,甚至可能更简单:
ASK WHERE { datafeed:Arduino rdfs:subClassOf ssn:System . }
如果商店中存在三元组,则会返回true
,否则会返回false
。