是否有可能以编程方式找出两个实例是否属于同一个RDF类?

时间:2012-01-29 18:40:57

标签: java rdf semantic-web jena

是否有可能以编程方式找出两个实例是否属于同一类(使用api,如JENA)

4 个答案:

答案 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
}