2009-07-03 216 views
2

我在我的項目中使用了rowlex。我有一個屬性分配給我的RDF文件中的個人,它具有一個值。例如,對於個人'學生',有一個屬性'isMemberOf',其值爲班級uri'class00021'。 然後我想添加第二個值到這個屬性。例如uri'proj000052'的'Project'值。將多個值分配給屬性

問題出現在這裏:添加第二個值後,第一個值從屬性'isMemberOf'拋出,甚至超出其個人(學生),並作爲新個人存儲。

我用於此操作的代碼是這樣的:

//Add a class to a student 
public void Add_Class 
    (string uri_stu, string uri_class) 
{   
     //Open RDF 
     RdfDocument rdfDoc = new RdfDocument(@"RDF_Repository\RDF_Student.rdf"); 
     //Find the student 
     //Student student = new Student(uri_stu, rdfDoc); 
     Student student = (Student)rdfDoc.GetIndividual(uri_stu); 
     //Add a class 
     student.studyMemberOf = new ClassOfCourse(uri_class, rdfDoc); 
     rdfDoc.ExportToRdfXml(@"RDF_Repository\RDF_Student.rdf"); 
} 


//Add a project to a student 
public void Add_Project 
    (string uri_stu, string uri_proj) 
{ 
     //Open RDF 
     RdfDocument rdfDoc = new RdfDocument(@"RDF_Repository\RDF_Student.rdf"); 
     //Find the student 
     Student student = (Student)rdfDoc.GetIndividual(uri_stu); 
     //Add a project       
     student.studyMemberOf = new Project(uri_proj, rdfDoc); 
     rdfDoc.ExportToRdfXml(@"RDF_Repository\RDF_Student.rdf"); 
} 

所得RDF是這樣的:

<?xml version="1.0"?> 
<rdf:RDF xmlns:Ontologyowl="http://www.owl-ontologies.com/Ontology1243411901.owl#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
    <Ontologyowl:Student rdf:about="stu000012"> 
     <Ontologyowl:studyMemberOf> 
      <Ontologyowl:Project rdf:about="proj000052"/> 
     </Ontologyowl:studyMemberOf> 
    </Ontologyowl:Student> 
    <Ontologyowl:ClassOfCourse rdf:about="class000021"/> 
</rdf:RDF> 

...如果我們繼續增加,以前的屬性將是拋出。 那麼我該如何克服這個問題呢?

回答

4

對於每個本體類,ROWLEX都會生成兩個.NET類,一個是「全」和一個是「光」。兩個自動生成的類通過命名約定來區分。如果你的OWL類被命名爲「學生」,那麼輕量級也將被命名爲「學生」。完整的課程名爲「Student_」。它們完全可以互換,二者的純粹目的是方便。完整的類包含您需要的所有可能的方法/屬性。輕類只包含最常用的類。他們真正擁擠的完整課程的問題。對於每個單一的OWL屬性,您將在您的系統中獲得10個(!)屬性和方法。NET類:

  • 添加(類型安全)
  • 添加(不類型安全)
  • 刪除(類型安全)
  • 刪除(不類型安全)
  • 更換(類型安全)
  • 更換(不類型安全)
  • 非數組屬性(typesafe)
  • 非數組屬性(不是類型安全)
  • Array屬性(類型安全)
  • Array屬性(不類型安全)

如果您只有5 OWL屬性,以滿足,自動生成.NET滿級將有5×10方法/屬性。這些成員的數量很多很容易打敗intellisense的用處。因此,通常建議使用輕質類。

在輕類上,只有非數組屬性實現(除非基數限制明確指定),並且該屬性在內部調用replace方法。在你的情況下,你需要使用全班。

這是你如何獲得並使用完整的類(我沒有驗證碼):

Student_ student = (Student_)rdfDoc.GetIndividual(uri_stu, Student.Uri, false); 
student.AddstudyMemberOf(new Project(uri_proj, rdfDoc)); 
+0

非常感謝您的回答。 – Ehsan 2009-07-06 12:57:00

0

我對Rowlex並不熟悉,但我猜想問題在於如何創建新的謂詞(或不是,因爲它似乎)。

比較:

student.studyMemberOf = new ClassOfCourse(uri_class, rdfDoc); 

和:

student.studyMemberOf = new Project(uri_proj, rdfDoc); 

似乎表明,你分配一個新的個體到一個謂語,而不是增加新的語句相同的謂詞(這正是你的問題 - 我不知道這個答案是多麼有幫助)。

另外,在文體上,似乎你正在合併關於個人和你的本體論的陳述(他們共享相同的命名空間)。這可能不是你想要的,通常你的學生,班級和項目個人將是另一個命名空間中的URI(或匿名節點)。例如:

<?xml version="1.0"?> 
<rdf:RDF xmlns:Ontologyowl="http://www.owl-ontologies.com/Ontology1243411901.owl#" 
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
    <Ontologyowl:Student rdf:resource="http://students.uri/stu000012"> 
     <Ontologyowl:studyMemberOf> 
      <Ontologyowl:Project rdf:resource="http://projects.uri/proj000052"/> 
     </Ontologyowl:studyMemberOf> 
    </Ontologyowl:Student> 
    <Ontologyowl:ClassOfCourse rdf:resource="http://classes.uri/class000021"/> 
</rdf:RDF> 
+0

三江源很爲你的答案。 我應該說,我試圖將2個人分配給物體特性。所以在rdf中,行: Ehsan 2009-07-06 12:56:09

相關問題