Java 可以通过编程的方式找出两个实例是否属于同一个RDF类吗?
是否可以通过编程(使用诸如JENA之类的api)找出两个实例是否属于同一类比较它们的类: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中,给定实例可以有许多类型,因此您的问题实际上是“如何测试两
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
}