Можно ли программно определить, относятся ли два экземпляра к одному и тому же классу RDF? - PullRequest
7 голосов
/ 29 января 2012

Можно ли программным образом определить, относятся ли два экземпляра к одному и тому же классу (используя API, например, JENA)

Ответы [ 4 ]

8 голосов
/ 30 января 2012

Легко в SPARQL:

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

В API Jena:

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

Не очень элегантно.

4 голосов
/ 30 января 2012

Предполагая, что вы используете API онтологии Jena, это довольно просто. Обратите внимание, что в 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 голосов
/ 30 января 2012

Я так понимаю, это расширение вашего предыдущего поста, так что

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
}
0 голосов
/ 29 января 2012

Сравните свои классы:

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