2009-07-03 2 views
2

Я использую rowlex в своем проекте. У меня есть свойство, назначенное отдельному лицу в моем файле RDF, у которого есть значение. Например, для отдельного «Студента» существует свойство «isMemberOf» со значением класса uri «class00021». Затем я хочу добавить второе значение к этому свойству. Например, значение «Project» с uri 'proj000052'.Назначение нескольких значений для свойства

Проблема возникает здесь: после добавления второго значения первое значение выбрасывается из свойства 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 класс:

  • Добавить (типизированное)
  • Добавить (не типизированный)
  • Remove (типизированные)
  • Remove (не типизированный)
  • Заменить (типизированное)
  • Заменить (не типизированные)
  • Недвижимое имущество, не относящееся к типу собственности (типы)
  • Свойство без массива (не типичное)
  • массив свойства (типизированная)
  • массив свойства (не типизированные)

Если у вас есть только 5 свойств OWL для удовлетворения, то автоматически генерируемый .NET полного класса будет иметь 5x10 метод/свойство. Это большое количество членов легко побеждает полезность intellisense. Следовательно, рекомендуется использовать легкие классы.

В классе light у вас есть только реализованное свойство без массива (если ограничения на размерность явно не указаны напрямую), и это свойство внутренне вызывает метод replace. В вашем случае вам нужно использовать полный класс.

Это, как вы получите и использовать весь класс (я не проверял код):

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

Tahnk вы очень за этот ответ. – Ehsan

0

Я не знаком с Rowlex, но я думаю, проблема в том, как вы создаете свой новый предикат studyMemberOf (или нет, как кажется).

Сравнение:

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

Thankyou очень много для вашего ответа. Я должен сказать, что я пытаюсь назначить 2 человека объектной собственности. поэтому в rdf строка: Ehsan

Смежные вопросы