Присвоение нескольких значений свойству
Вопрос
Я использую 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>