Java 可以通过编程的方式找出两个实例是否属于同一个RDF类吗?

Java 可以通过编程的方式找出两个实例是否属于同一个RDF类吗?,java,rdf,semantic-web,jena,Java,Rdf,Semantic Web,Jena,是否可以通过编程(使用诸如JENA之类的api)找出两个实例是否属于同一类比较它们的类: boolean same = obj1.getClass().equals(obj2.getClass()); SPARQL中的Easy: ASK { <instance1> a ?class . <instance2> a ?class . } 不是很优雅。假设您使用的是Jena本体API,它非常简单。请注意,在RDF中,给定实例可以有许多类型,因此您的问题实际上是“如何测试两

是否可以通过编程(使用诸如JENA之类的api)找出两个实例是否属于同一类比较它们的类:

boolean same = obj1.getClass().equals(obj2.getClass());
SPARQL中的Easy:

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

不是很优雅。

假设您使用的是Jena本体API,它非常简单。请注意,在RDF中,给定实例可以有许多类型,因此您的问题实际上是“如何测试两个实例是否有一个或多个公共类型?”

我会这样做。假设您要测试的两个实例是
单个
对象(请注意,您可以使用
OntResource
,甚至是
资源
,只需稍微更改代码):

列出每个的
rdf:type
值,并将其转换为集合

Set<Resource> types0 = i0.listRDFTypes( false ).toSet();
Set<Resource> types1 = i1.listRDFTypes( false ).toSet();

我想这是你之前的文章的延伸,所以

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
}

你能使用纯Java方法吗?为什么是Jena?你可以很容易地得到这两个对象的
.class
,并对它们进行比较。我认为这个问题与java实例和类无关,但与RDF/OWL实例和类有关。user205512:你是对的,我想比较RDF/OWL实例。OP对此不是100%清楚,但问题很可能涉及RDF/OWL类和实例,而不是Java类比较。番石榴有
set.intersection
,可读性更强。打字错误:
…types1=i1.listRDFTypes…
嗨,我还是有些困惑。希望你能解决这个问题。正如你所建议的,我得到类型并比较它们的交叉点。问题是:对于两个不同类的实例,
listRDFTypes
仍然返回
[http://www.w3.org/2002/07/owl#Class]
作为一种类型。因此,我使用的任何两个实例都是相同类型的。我遗漏了什么吗?如果资源具有
rdf:type
owl:Class
,那么它是一个类,而不是一个类的实例。或者你的模特有什么不寻常的地方。如果您确信使用
rdf:type owl:Class
适合您的域模型,那么您可以从集合中筛选出
owl:Class
。如果这还不够解释,请准备一个问题的最小示例(代码和数据),并通过电子邮件发送到Apache的jena用户支持列表。现在SPARQL 1.1有了属性路径,SPARQL查询简化为
ASK{?class^a,}
。它很好地描述了“是否存在一个实例1和实例2都是实例的类?”
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
}
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
}