Jena и RDFS: получить свойство из внешней онтологии

У меня есть онтология RDFS с классом User как таковым:

<rdfs:Class rdf:ID="User"> 
    <rdfs:subClassOf rdf:resource="http://xmlns.com/foaf/0.1/Agent" />
    <rdfs:comment> 
        The class of users, subclassing the foaf:Agent class.
    </rdfs:comment>  
</rdfs:Class>

У класса foaf:Agent есть свойство name, которое я хотел бы загрузить с помощью Jena с чем-то вроде:

Property name = model.getOntProperty(ns + "name");

Проблема в том, что я получаю исключение NullPointerException, когда пытаюсь использовать его следующим образом:

model.createStatement(resource, name, "Nicolas Cage");

Я также пытался использовать стандартное пространство имен foaf (ns = "http://xmlns.com/foaf/0.1/";), хотя и не уверен, насколько это разумно.

В конце концов, я понятия не имею, какой правильный подход для этого. Должен ли я создать его? Разве Йена не находит это как-то автоматически во внешней онтологии?


person cgf    schedule 22.05.2014    source источник
comment
Пожалуйста, предоставьте полный, минимальный пример. Детали имеют значение. Ваш нулевой указатель связан с чем-то другим - проверьте трассировку стека.   -  person AndyS    schedule 23.05.2014
comment
Вам не нужно ничего загружать, чтобы создать свойство. Свойства идентифицируются по URI, и вам просто нужно указать URI, что вы правильно делаете с Property name = model.getOntProperty(ns + "name");, если на самом деле ns это http://xmlns.com/foaf/0.1/.   -  person Joshua Taylor    schedule 24.05.2014


Ответы (2)


В RDF ресурсы, включая свойства, идентифицируются по URI. Нет смысла загружать эти URI. Иногда документы, идентифицируемые с помощью URI, могут содержать нужные операторы, и в этом случае вам потребуется загрузить документ, содержащий их, но это отличается от простой ссылки на свойство. Вот пример:

import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.riot.RDFFormat;

import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.Statement;

public class UseFoafNameExample {
    public static void main(String[] args) {
        Model model = ModelFactory.createDefaultModel();
        Property name = model.createProperty( "http://xmlns.com/foaf/0.1/name" );
        Resource resource = model.createResource( "http://stackoverflow.com/q/23818390/1281433/NicholasCage" );
        Statement s = model.createStatement( resource, name, "Nicholas Cage" );
        model.add( s );
        RDFDataMgr.write( System.out, model, RDFFormat.RDFXML_ABBREV );
    }
}
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:j.0="http://xmlns.com/foaf/0.1/">
  <rdf:Description rdf:about="http://stackoverflow.com/q/23818390/1281433/NicholasCage">
    <j.0:name>Nicholas Cage</j.0:name>
  </rdf:Description>
</rdf:RDF>

Теперь в вашем вопросе есть еще одна проблема.

Класс foaf:Agent имеет свойство с именем name, которое я хотел бы загрузить с помощью Jena с чем-то вроде:

класс foaf:Agent не имеет свойства; это не то, как работают классы RDFS (и OWL). Есть свойство name, у которого Agent вместо rdfs:domain (я не проверял, так ли это на самом деле, но звучит разумно, и я предполагаю, что именно из-за этого возникла путаница). Это означает, что когда у вас есть тройка

x foaf:name "some name"

вы можете заключить, что

x rdf:type foaf:Agent

Конечно, чтобы сделать такой вывод, вам нужно знать о тройном

foaf:name rdfs:domain foaf:Agent

и это то, что вы можете загрузить онтологию из другого места. То есть вы хотите получить содержащиеся в нем аксиомы, чтобы можно было с ними рассуждать.

person Joshua Taylor    schedule 23.05.2014
comment
Итак, вы говорите, что в RDF вам не обязательно определять ресурс как foaf:Agent, если вы просто создаете его и связываете со свойством foaf:name? - person cgf; 24.05.2014
comment
Если вы утверждаете, что x foaf:name "foo" и у вас есть тройка foaf:name rdfs:domain foaf:Agent и у вас есть аргумент, то вы можете заключить, что x rdf:type foaf:Agent. - person Joshua Taylor; 24.05.2014

Jena не будет автоматически загружать что-то только потому, что это упоминается.

rdf:resource="http://xmlns.com/foaf/0.1/Agent"

это просто упоминание имени Agent и ничего не говорится о его извлечении. Это просто любой старый URI для RDF - и он может не существовать.

person AndyS    schedule 23.05.2014