2012-10-30 26 views
1

考慮下面的本體論,其中PERSON,NAME,SURNAMEIDENTIFICATION是類。 NAMESURNAMEIDENTIFICATION的子類。 hasSurnamehasName功能對象屬性hasValue是一個帶有域IDENTIFICATION和Range字符串的DataTypeProperty。如何讓一個人與耶拿的Objectproperty相匹配?

enter image description here

讓我們用做與耶拿2人這種模式的自動instanciation,PERSON1是「亨利·福特」和PERSON2是「哈里森·福特」。

爲了處理這種重複,希望根據下面的模式自動實例化本體,其中個體name1同時用於person1和person2。

String NS = .... // the name space 
OntModel model = .... // Jena model to use 

// creating all the individuals with random uri 

Individual person1 = model.createIndividual(NS + "PERSON" + Math.random()); 
Individual name1 = model.createIndividual(NS + "NAME" + Math.random()); 
Individual surname1 = model.createIndividual(NS + "SURNAME" + Math.random()); 
Individual person2 = model.createIndividual(NS + "PERSON" + Math.random()); 
Individual name2 = model.createIndividual(NS + "NAME" + Math.random()); 
Individual surname2 = model.createIndividual(NS + "SURNAME" + Math.random()); 

// asserting that ... 
// person1 _hasName_ (name1 _hasValue_ "Ford")  
// person1 _hasSurname (surname1 _hasValue_ "Henry") 

name1.addProperty(model.getOntProperty(NS + "hasValue"), Resourcefactory.createLiteral("Ford")); 
surname1.addProperty(model.getOntProperty(NS + "hasValue"), Resourcefactory.createLiteral("Henry")); 
model.add(person1, model.getOntProperty(NS + "hasName"), name1); 
model.add(person1, model.getOntProperty(NS + "hasSurname"), surname1); 


name1 = null; // loosing reference to name1 

// asserting that ... 
// person2 _hasName_ name1 
// person2 _hasSurname (surname2 _hasValue_ "Harrison") 

如何找到NAME類的單個哪個屬性hasvalue是「福特」,以正確地完成instanciation?

感謝您的回覆。

回答

3

概念上,爲什麼surname1surname2必須是不同的個人?在那裏使用Math.random()看起來很奇怪。如果你考慮你所說的問題,你有兩個人,亨利·福特和哈里森·福特,而在你的領域模型中,你希望名字和姓氏是不同的個人(我認爲你有一個很好的理由,這是一種奇怪的方式接近這個特定的問題)。所以我對你的建模方法的問題是:有兩個人共用一個福特姓,還是兩個姓氏碰巧有相同的字面?

個人而言,我圖中所利用的共同結構接近這個:

ns:ford 
    a ns:Surname ; 
    ns:hasValue "Ford". 

ns:harrison 
    a ns:FirstName ; 
    ns:hasValue "Harrison". 

ns:henry 
    a ns:FirstName ; 
    ns:hasValue "Henry". 

ns:person1 
    a ns:Person ; 
    ns:firstName ns:henry ; 
    ns:surname ns:ford . 

ns:person2 
    a ns:Person ; 
    ns:firstName ns:harrison ; 
    ns:surname ns:ford . 

但是,我不知道你想什麼要解決的問題,所以我真的不能說這是否對你來說是正確的方法。例如,它可以很容易地找到所有具有相同姓氏的人。

一般來說,如果你希望在圖形共享節點,所以你想福特的兩種不同的用途是不同的,你可以使用空白節點,以節省擺弄隨機數:

ns:person1 
    a ns:Person ; 
    [a ns:SurName ; ns:hasValue "Ford"] ; 
    [a ns:FirstName ; ns:hasValue "Henry"]. 

所以我對你的主要答案的問題是明確你想要建立的圖。那麼耶拿所稱你需要做的事情會更清晰。

爲了回答您的具體問題,如果您要根據其性質圖案定位特定的資源,我建議使用SPARQL查詢。您可以使用Jena API調用模式來完成此操作,但是一旦您通過初始大小較小的模式,SPARQL查詢就會更加緊湊。

+0

謝謝@Ian_Dickinson的回覆。爲了回答你的問題,我會說我想建立一個福特姓氏可以被許多人共享的圖表。這是爲了減少生產的貓頭鷹文件的大小。問題是如何確定我的耶拿模型中是否已經有一個姓氏,我可以將一個新人連接到?因此找到他的財產有價值匹配'福特'的姓氏的個人。如果沒有,我會創建新的姓氏,否則我會將新人鏈接到這個姓氏。在你的答案中看起來像SPARQL可以提供幫助(如何?) –

+0

如果仔細看看我建議的OWL代碼,你會發現只有一個節點用於福特姓氏,其中包括URI:ns:ford。在Jena模型中,如果調用'getResource()',它將在模型中創建一個新資源(如果尚未存在的話),或者如果存在,則重新使用相同的資源。所以你不需要使用SPARQL--只要你使用相同的URI即可。如果您使用添加了隨機數的URI,這顯然不起作用。 –

+0

就我而言,我沒有這個資源的URI。這是由於這個資源已經在自動本體實例代碼中的某些循環之前被實例化了。我對資源的唯一信息是它具有給定的屬性值「Ford」。所以我對一個具有給定財產價值的個體感興趣。 –