Domanda

Sto usando rowlex nel mio progetto. Ho un immobile assegnato ad un individuo nel mio file RDF, che ha un valore. Ad esempio per i singoli 'Studente', c'è una proprietà 'IsMemberOf', con il valore di una classe URI 'class00021'. Poi voglio aggiungere un secondo valore a questa proprietà. Per esempio un valore di 'Progetto' 'con proj000052' URI.

Il problema appare qui: dopo aver aggiunto il secondo valore, primo valore è gettato fuori della proprietà 'IsMemberOf', anche al di fuori della sua individuale (studente), ed è archiviato come un nuovo individuo

.

Il codice che ho usato per questa operazione è simile a questo:

//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");
}

L'RDF risultato è simile a questo:

<?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 continuiamo aggiungendo la proprietà precedente sarà gettato fuori. Così come posso superare questo problema?

È stato utile?

Soluzione

Per ogni classe dell'ontologia, ROWLEX genera due classi .NET un "pieno" e una "luce" uno. Le due classi generati automaticamente si differenziano per convenzione di denominazione. Se la classe OWL è chiamato "Student" rispetto alla classe luce si chiamerà "Student", anche. La classe completa si chiama "Student_". Sono completamente intercambiabili tra loro, il puro scopo di avere due è la convenienza. La classe completa contiene tutte le possibili metodi / proprietà è necessario. La classe di luce contiene solo quelli più frequentemente usati. Il problema con le classi piene che ottenere davvero affollata. Per ogni proprietà OWL singola si ottengono 10 proprietà e metodi per nella classe .NET (!):

  • Aggiungi (typesafe)
  • Aggiungi (non tipizzate)
  • Rimuovi (typesafe)
  • Rimuovi (non tipizzate)
  • Sostituire (typesafe)
  • Sostituire (non tipizzate)
  • Casa non array (typesafe)
  • Casa non array (non typesafe)
  • proprietà Array (typesafe)
  • proprietà di matrice (non typesafe)

Se si dispone di soli 5 proprietà OWL per soddisfare, la classe completa .NET generato automaticamente avrà 5x10 metodi / proprietà. Questi elevato numero di componenti facilmente sconfiggere l'utilità di IntelliSense. Perciò generalmente si raccomanda l'utilizzo di classi leggeri.

Al di classe luce, si ha solo la proprietà non di matrice implementato (a meno che le restrizioni della cardinalità esplicitamente diretta in altro modo) e che la proprietà chiama internamente il metodo replace. Nel tuo caso è necessario utilizzare la classe intera.

Questo è come si ottiene e utilizza la classe completa (non ho verificare il codice):

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

Altri suggerimenti

Non ho familiarità con Rowlex, ma direi il problema è come si sta creando il nuovo studyMemberOf predicato (o non, come sembra).

Confronto:

student.studyMemberOf = new ClassOfCourse(uri_class, rdfDoc);

e

student.studyMemberOf = new Project(uri_proj, rdfDoc);

sembrerebbe indicare che si sta assegnando un nuovo individuo ad un singolo predicato, piuttosto che aggiungere una nuova dichiarazione con lo stesso predicato (che è esattamente la tua domanda - io non sono sicuro di come utile questa risposta).

Inoltre, su una nota stilistica, a quanto pare si uniscono le sue dichiarazioni relative agli individui e la tua ontologia (che stanno condividendo lo stesso spazio dei nomi). Questo non è probabilmente quello che si vuole, di solito il vostro studente, di classe, e gli individui progetto sarebbe URI (o nodi anonimi) in un altro spazio dei nomi. Ad esempio:

<?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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top