2012-01-29 57 views
7

是否有可能找出两个实例是否是同一类的,编程(使用API​​如JENA)是否有可能通过编程的方式找出两个实例是否具有相同的RDF类?

+0

您可以使用纯Java方法吗? – Jivings 2012-01-29 19:31:34

+2

为什么选择耶拿?您可以轻松获取这两个对象的'.class'并进行比较。 – 2012-01-29 19:36:03

+2

我不认为这个问题涉及到java实例和类,而是RDF/OWL实例和类。 – user205512 2012-01-29 21:42:14

回答

8

容易在SPARQL:

ASK { <instance1> a ?class . <instance2> a ?class . } 

在耶拿API:

boolean shareClass = false; 
for (Statement s: instance1.listProperties(RDF.type)) { 
    if (instance2.hasProperty(RDF.type, s.getObject()) { 
     shareClass = true; 
     break; 
    } 
} 

还没有ve优雅。

+0

+1,只回答不是超出主题或现在 – ysdx 2012-01-29 21:14:00

+0

既然SPARQL 1.1具有属性路径,则SPARQL查询简化为'ASK {?class^a }'。它非常好地捕捉到“是否有instance1和instance2都是实例的类?” – 2014-06-30 23:36:39

0

比较自己的班级:

boolean same = obj1.getClass().equals(obj2.getClass()); 
+0

+1:也可以使用'=='。 – 2012-01-29 20:25:49

+1

OP对此没有100%清楚,但这个问题很可能涉及RDF/OWL类和实例,而不是Java类比较。 – 2012-01-29 22:59:52

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 
} 
+0

这更令人愉快。番石榴有'Sets.intersection'这将更加可读。错字:'... types1 = i1.listRDFTypes ...' – user205512 2012-01-31 13:43:30

+0

谢谢,错字修正 – 2012-01-31 13:46:05

+0

嗨,我还是有些困惑。希望你能清楚这一点。正如你所建议的,我得到的类型和比较他们的交集。问题是:对于两个不同类的实例,'listRDFTypes'仍然返回'[http://www.w3.org/2002/07/owl#Class]'作为一个类型。结果,我采取的任何两个实例都是相同的类型。我错过了什么吗? – PCoder 2012-02-02 17:41:13

-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 
} 
相关问题