2014-05-22 78 views
0

獲取財產我有一個RDFS本體具有User類這樣:耶拿和RDFS:從外部本體

<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,我想用耶拿加載的東西類似於:

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

的問題是,我得到一個NullPointerException當我嘗試使用它像這樣:

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

我也嘗試過使用foaf標準命名空間(ns = "http://xmlns.com/foaf/0.1/";),儘管我不確定它有多少意義。

最後,我不知道什麼是正確的方法。我應該創建它嗎? Jena不知何故在外部本體中自動找到它?

+1

請提供一個完整的,最簡單的例子。細節很重要。 你的空指針是由於不同的東西 - 檢查堆棧跟蹤。 – AndyS

+0

您不必加載任何內容即可創建屬性。屬性由URI標識,並且您只需引用URI,您正在使用'Property name = model.getOntProperty(ns +「name」)正確執行;「如果實際上'ns'爲'http: // xmlns.com/FOAF/0.1 /'。 –

回答

1

在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:代理類有一個名爲name屬性,我會用耶拿有類似的東西喜歡 負載:

的FOAF:代理類不具有的屬性;這不是RDFS(和OWL)類的工作方式。有一個屬性nameAgent作爲rdfs:domain(我沒有檢查確實是這種情況,但這聽起來很合理,我猜這就是混淆的起因)。這意味着,當你有一個三重

x foaf:name "some name" 

可以推斷

x rdf:type foaf:Agent 

當然,要做到那種推理的,你需要了解三

foaf:name rdfs:domain foaf:Agent 

這就是你可能想從其他地方加載本體。也就是說,你想獲得它包含的公理,這樣你就可以對它們進行推理。

+0

所以你說的是,如果你只是創建它並將它鏈接到'foaf:name'屬性,那麼在RDF中,你不一定必須將資源定義爲'foaf:Agent'。 – cgf

+1

如果你斷言'x foaf:name「foo」'*和*你有三個'foaf:name rdfs:domain foaf:Agent' * *並且你有一個推理器,那麼你可以*推斷* x rdf :鍵入foaf:Agent'。 –

0

Jena不會因爲提及而自動加載內容。

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

只是提到了Agent的名字,並沒有提到它的提及。它只是任何舊的URI到RDF - 它可能不存在。