是否有可能以编程方式找出两个实例是否属于同一类(使用api,如JENA)
答案 0 :(得分:8)
SPARQL中很容易:
ASK { <instance1> a ?class . <instance2> a ?class . }
在Jena API中:
boolean shareClass = false;
for (Statement s: instance1.listProperties(RDF.type)) {
if (instance2.hasProperty(RDF.type, s.getObject()) {
shareClass = true;
break;
}
}
不太优雅。
答案 1 :(得分:4)
假设您使用的是Jena本体API,它非常简单。请注意,在RDF中,给定实例可以有多种类型,因此您的问题实际上是“我如何测试两个实例是否共有一种或多种类型?”。
我会这样做。假设您要测试的两个实例是Individual
个对象(请注意,您可以使用OntResource
执行此操作,甚至可以Resource
执行此操作,但代码略有变化):
Individual i0 = ....;
Individual i1 = ....;
列出每个rdf:type
的值,并将它们转换为集
Set<Resource> types0 = i0.listRDFTypes( false ).toSet();
Set<Resource> types1 = i1.listRDFTypes( false ).toSet();
如果交集非空,它们有共同的类型:
types0.retainAll( types1 );
if (!types0.isEmpty()) {
// at least one type in common
// types0 contains the common type resources
}
答案 2 :(得分:0)
比较他们的课程:
boolean same = obj1.getClass().equals(obj2.getClass());
答案 3 :(得分:-1)
我认为这是你早期帖子的扩展,所以
if (resource1.hasProperty(model.createProperty("http://www.w3.org/1999/02/22-rdf-syntax-ns#", "type"), model.createResource("http://typeUri")) && resource2.hasProperty(model.createProperty("http://www.w3.org/1999/02/22-rdf-syntax-ns#", "type"), model.createResource("http://typeUri"))) {
// both resources are the same type
}