Atribuir vários valores a uma propriedade
Pergunta
Eu estou usando rowlex no meu projeto. Eu tenho uma propriedade atribuído a um indivíduo no meu arquivo RDF, que tem um valor. Por exemplo, para indivíduo 'Student', não é uma propriedade 'isMemberOf', com valor de uma classe uri 'class00021'. Então eu quero adicionar um segundo valor para essa propriedade. Por exemplo, um valor de 'Projeto' com uri 'proj000052'.
O problema aparece aqui:. Depois de adicionar o segundo valor, primeiro valor é jogado para fora da propriedade 'isMemberOf', mesmo fora de sua indivíduo (estudante), e é armazenado como um novo indivíduo
O código que usei para esta operação é assim:
//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");
}
O resultado RDF é assim:
<?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>
... e se continuar a adicionar, a propriedade anterior será jogado fora. Então, como posso superar este problema?
Solução
Para cada classe ontologia, ROWLEX gera duas classes .NET um "completo" e uma "luz". As duas classes de autoprodução são diferenciados por convenção de nomenclatura. Se sua classe OWL é chamado de "Student" que a classe luz será nomeado "Student", também. A classe completo é chamado "Student_". Eles são completamente permutáveis ??com o outro, a finalidade pura de ter dois é conveniência. A classe completa contém todos os métodos possíveis / propriedades que você precisa. A classe luz contém apenas os mais queridos frequentemente utilizados. O problema com as classes completos que eles realmente cheia. Para cada propriedade OWL único você vai ter 10 propriedades e métodos para a sua classe .NET (!):
- Add (typesafe)
- Adicionar (não typesafe)
- Remover (typesafe)
- Remover (não typesafe)
- Substitua (typesafe)
- Substitua (não typesafe)
- propriedade não-array (typesafe)
- propriedade não-array (não typesafe)
- propriedade Array (typesafe)
- propriedade Array (não typesafe)
Se você tem apenas 5 propriedades OWL para atender, a classe cheia .NET gerado automaticamente terá 5x10 métodos / propriedades. Estes elevado número de membros derrotar facilmente a utilidade de intellisense. Por isso, geralmente o uso de classes de luz são recomendados.
Na classe luz, você tem apenas a propriedade não variedade implementado (a menos que restrições de cardinalidade directo, expressamente de outra forma) e que a propriedade internamente chama o método substituir. No seu caso, você precisa usar a classe completo.
Isto é como você obter e usar a classe cheia (eu não verificar o código):
Student_ student = (Student_)rdfDoc.GetIndividual(uri_stu, Student.Uri, false);
student.AddstudyMemberOf(new Project(uri_proj, rdfDoc));
Outras dicas
Eu não estou familiarizado com Rowlex, mas eu acho que a questão é como você está criando o seu novo predicado studyMemberOf
(ou não, como parece).
Comparando:
student.studyMemberOf = new ClassOfCourse(uri_class, rdfDoc);
e
student.studyMemberOf = new Project(uri_proj, rdfDoc);
parece indicar que você está atribuindo um novo indivíduo a um único predicado, ao invés de adicionar uma nova declaração com o mesmo predicado (que é exatamente a sua pergunta - Eu não tenho certeza o quão útil esta resposta é).
Além disso, em uma nota de estilo, parece que você estão se fundindo suas declarações sobre os indivíduos e sua ontologia (eles estão compartilhando o mesmo espaço de nomes). Isso provavelmente não é o que você quer, geralmente seus estudante, classe, e indivíduos do projeto seria URIs (ou nós anônimos) em outro namespace. Por exemplo:
<?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>