Присвоение нескольких значений свойству

StackOverflow https://stackoverflow.com/questions/1078494

  •  21-08-2019
  •  | 
  •  

Вопрос

Я использую rowlex в своем проекте.У меня есть свойство, назначенное отдельному лицу в моем RDF-файле, которое имеет значение.Например, для отдельного «Студента» существует свойство «isMemberOf» со значением uri класса «class00021».Затем я хочу добавить к этому свойству второе значение.Например, значение «Проект» с 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>

...и если мы продолжим добавление, предыдущее свойство будет выброшено.Итак, как я могу преодолеть эту проблему?

Это было полезно?

Решение

Для каждого класса онтологии ROWLEX генерирует два класса .NET: «полный» и «облегченный».Два автоматически созданных класса различаются соглашением об именах.Если ваш класс OWL называется «Студент», то легкий класс также будет называться «Студент».Полный класс называется «Student_».Они полностью взаимозаменяемы, и их использование в двух случаях является удобством.Полный класс содержит все возможные методы/свойства, которые вам нужны.Легкий класс содержит только наиболее часто используемые.Проблема с полными классами в том, что они очень переполнены.Для каждого свойства OWL вы получите 10 (!) свойств и методов вашего .NET-класса:

  • Добавить (типобезопасный)
  • Добавить (не типобезопасно)
  • Удалить (типобезопасно)
  • Удалить (не типобезопасно)
  • Заменить (типобезопасно)
  • Заменить (не типобезопасно)
  • Свойство, не являющееся массивом (типобезопасное)
  • Свойство, не являющееся массивом (не типизированное)
  • Свойство массива (типобезопасное)
  • Свойство массива (не типобезопасное)

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

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

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

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

Другие советы

Я не знаком с 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top