想象一下以下的分类法(非循环和有向图):
<my:Eukaryota> <rdfs:subClassOf> <my:Organism>.
<my:Mammal> <rdfs:subClassOf> <my:Eukaryota>.
<my:Primate> <rdfs:subClassOf> <my:Mammal>.
<my:HomoSapiens> <rdfs:subClassOf> <my:Primate>.
<my:Bacteria> <rdfs:subClassOf> <my:Organism>.
<my:Escherichia> <rdfs:subClassOf> <my:Bacteria>.
1)Jena OWL API是否可以检查给定资源(例如HomoSapiens)是否是'Mammal'的子类而不递归检索所有父节点?
2)与SPARQL相同的问题。
由于
答案 0 :(得分:4)
如果您已经在使用Jena,则可以使用Pellet的SPARQL-DL query engine,这样可以让您以本体感知的方式查询个人。
或者,您可以使用Jena的InfModel
代替Model
界面,附加推理器(和本体),然后运行RobV提及的查询。如果您愿意,可以使用Pellet's reasoner。如果您只想进行推理,则无需使用OntModel
。
答案 1 :(得分:3)
1)没有多少使用Jena,但它的OntTools类似乎包含最低共同祖先的函数。如果HomoSapiens和Mammal的最不常见的祖先是哺乳动物,那么HomoSapiens就是哺乳动物。在引擎盖下,它使用递归的subClassOf检索。
2)在通用情况下,不,SPARQL不支持任意深度树遍历。但是如果你知道subClassOf树的最大深度,那么你可以构造一个像
这样的查询ASK {
OPTIONAL {
:HomoSapiens rdfs:subClassOf :Mammal
}
OPTIONAL {
:HomoSapiens rdfs:subClassOf ?c .
?c rdfs:subClassOf :Mammal
}
OPTIONAL {
:HomoSapiens rdfs:subClassOf ?c1 .
?c1 rdfs:subClassOf ?c2 .
?c2 rdfs:subClassOf :Mammal
}
# ... add
}
答案 2 :(得分:2)
laalto是对的,几乎任何语义Web库都将通过递归的subClassOf检索来实现。只有你可能解决这个问题的方法是有一些推理/推理引擎,它会在解析原始图形时为图表添加额外的三元组
例如,它会自动添加以下内容:
<my:Eukaryota> <rdf:type> <my:Organism>.
<my:Mammal> <rdf:type> <my:Organism>.
<my:Mammal> <rdf:type> <my:Eukaryota>.
<my:Primate> <rdfs:type> <my:Organism>.
<my:Primate> <rdfs:type> <my:Eukaryota>.
<my:Primate> <rdfs:type> <my:Mammal>.
# etc...
你如何在耶拿这样做我不确定,知道耶拿的其他人必须回答这个问题。
至于SPARQL,laalto再次完全正确,在某些情况下,如果您查询的Triple Store和关联的SPARQL端点具有一些推理功能,您可能能够执行如下所述的简单查询
PREFIX my: <http://yournamespace.com>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
ASK { my:HomoSapiens rdf:type my:Mammal }
答案 3 :(得分:1)
SPARQL 1.1具有任意深度图遍历。哪个可用于此。请参阅BioStar
上的相关问题ASK { :HomoSapiens rdfs:subClassOf +:哺乳动物 }