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?

Foi útil?

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top