【问题标题】:Is it possible to find out whether two instances are of the same RDF class, programmatically?是否有可能以编程方式找出两个实例是否属于同一个 RDF 类?
【发布时间】:2012-01-29 18:40:56
【问题描述】:

是否可以通过编程方式确定两个实例是否属于同一类(使用 JENA 等 api)

【问题讨论】:

  • 可以使用纯Java方法吗?
  • 为什么选择耶拿?您可以轻松获取两个对象的.class 并进行比较。
  • 我不认为这个问题涉及 java 实例和类,而是 RDF / OWL 实例和类。
  • user205512:你说得对,我想比较 RDF/OWL 实例。

标签: java rdf semantic-web jena


【解决方案1】:

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;
    }
}

不是很优雅。

【讨论】:

  • 现在 SPARQL 1.1 具有属性路径,SPARQL 查询简化为 ASK { ?class ^a &lt;instance1&gt;, &lt;instance2&gt; }。它很好地捕捉到了“是否存在一个 instance1 和 instance2 都是实例的类?”
【解决方案2】:

假设您使用的是 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
}

【讨论】:

  • 那更令人愉快。番石榴有Sets.intersection,这将更具可读性。错字:...types1 = i1.listRDFTypes...
  • 嗨,我还是有些困惑。希望你能把它弄清楚。正如你所建议的,我得到了类型并比较了它们的交集。问题是:对于两个不同类的实例,listRDFTypes 仍将[http://www.w3.org/2002/07/owl#Class] 作为类型返回。结果,我采取的任何两个实例都是同一类型。我错过了什么吗?
  • 如果一个资源有rdf:typeowl:Class,它一个类而不是一个类的实例。或者你的建模中有一些不寻常或损坏的东西。如果您确信 rdf:type owl:Class 对您的域模型是正确的,那么您可以从集合中过滤掉 owl:Class。如果这还不够解释,请准备一个最小问题示例(代码和数据)并将其通过电子邮件发送到 Apache 的 jena-users 支持列表。
【解决方案3】:

比较他们的课程:

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

【讨论】:

  • OP 对此并不是 100% 清楚,但问题很可能与 RDF/OWL 类和实例有关,而不是 Java 类比较。
【解决方案4】:

我认为这是您之前帖子的扩展,所以

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
}

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 2012-08-07
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多