是否可以通过编程方式查明两个实例是否属于同一 RDF 类?

发布于 2024-12-29 15:55:34 字数 45 浏览 0 评论 0原文

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

Is it possible to find out whether two instances are of the same class, programmatically (Using api such as JENA)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

心凉怎暖 2025-01-05 15:55:36

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

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
}

I take it this is an extension to your earlier post so

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
}
花之痕靓丽 2025-01-05 15:55:35

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

不是很优雅。

Easy in SPARQL:

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

In Jena API:

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

Not very elegant.

初懵 2025-01-05 15:55:35

假设您正在使用 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
}

Assuming you are using the Jena ontology API, it's pretty straightforward. Note that in RDF, a given instance can have many types, so your question is really "how can I test if two instances have one or more types in common?".

I would do it as follows. Assume the two instances you want to test are Individual objects (note that you can do this with OntResource, or even Resource with a slight change in the code):

Individual i0 = ....;
Individual i1 = ....;

List the rdf:type values for each, and convert them to sets

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

They have types in common if the intersection is non-empty:

types0.retainAll( types1 );
if (!types0.isEmpty()) {
    // at least one type in common
    // types0 contains the common type resources
}
泪冰清 2025-01-05 15:55:35

比较他们的班级:

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

Compare their classes:

boolean same = obj1.getClass().equals(obj2.getClass());
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文