Frage

Ich verwende in meinem Projekt rowlex. Ich habe eine Eigenschaft einer Person zuteilt, in meiner RDF-Datei, die einen Wert hat. Zum Beispiel für einzelnen ‚Student‘, gibt es eine Eigenschaft ‚IsMemberOf‘, mit dem Wert einer Klasse uri ‚class00021‘. Dann möchte ich einen zweiten Wert dieser Eigenschaft hinzuzufügen. Zum Beispiel kann ein 'Projekt' Wert mit uri 'proj000052'.

Das Problem scheint hier: nach dem zweiten Wert hinzugefügt wird, wird zunächst Wert von Eigentum geworfen ‚IsMemberOf‘, auch aus seinem individuellen (Student) und wird als ein neues Individuum gespeichert

.

Der Code, den ich für diesen Vorgang verwendet wird, ist wie folgt:

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

Das resultierende RDF ist wie folgt:

<?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>

... und wenn wir das Hinzufügen fortsetzen, wird die vorherige Eigenschaft geworfen. Also, wie kann ich dieses Problem überwinden?

War es hilfreich?

Lösung

Für jede Ontologie-Klasse erzeugt ROWLEX zwei .NET-Klassen ein „voll“ und ein „Licht“ ein. Die beiden automatisch generierten Klassen werden durch Namenskonvention zu unterscheiden. Wenn Ihre OWL-Klasse „Student“ genannt, als die Licht Klasse „Student“, auch genannt werden. Die volle Klasse „Student_“ genannt. Sie sind vollständig untereinander austauschbar, der schiere Zweck zwei zu haben, ist Bequemlichkeit. Die vollständige Klasse enthält alle möglichen Methoden / Eigenschaften, die Sie benötigen. Die Licht Klasse enthält nur die am häufigsten verwendeten diejenigen. Das Problem mit vollen Klassen, die sie wirklich voll. Für jede einzelne OWL Eigenschaft erhalten Sie 10 Eigenschaften und Methoden für in Ihrer .NET-Klasse (!):

  • Fügen (typsicher)
  • Fügen Sie (nicht typsicher)
  • Entfernen (typsicher)
  • Entfernen (nicht typsicher)
  • Ersetzen (typsicher)
  • Ersetzen (nicht typsicher)
  • Non-Array-Eigenschaft (typsicher)
  • Non-Array-Eigenschaft (nicht typsicher)
  • Array-Eigenschaft (typsicher)
  • Array-Eigenschaft (nicht typsicher)

Wenn Sie nur 5 OWL Eigenschaften für gerecht, die automatisch generierten .NET volle Klasse 5x10 Methoden / Eigenschaften haben. Diese hohe Anzahl von Mitgliedern leicht die Nützlichkeit von Intellisense besiegen. Daher im Allgemeinen die Verwendung von Licht Klassen empfohlen.

Auf der Licht Klasse, haben Sie nur die nicht-Array-Eigenschaft implementiert (es sei denn Mächtigkeit Einschränkungen ausdrücklich etwas anderes lenken) und diese Eigenschaft ruft intern die Methode ersetzen. In Ihrem Fall müssen Sie die Voll Klasse verwenden.

Dies ist, wie Sie die volle Klasse erhalten und verwenden (ich habe den Code nicht überprüfen):

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

Andere Tipps

Ich bin nicht vertraut mit Rowlex, aber ich würde vermuten, das Problem ist, wie Sie Ihr neues studyMemberOf Prädikat sind die Schaffung (oder auch nicht, wie es scheint).

Beim Vergleich:

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

und

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

Würde zu zeigen scheint, dass Sie ein neues Individuum zu einem einzigen Prädikat sind zuweisen, anstatt das Hinzufügen eine neue Anweisung mit demselben Prädikat (was genau Ihre Frage ist - Ich bin nicht sicher, wie hilfreich diese Antwort ist).

Auch auf eine stilistische Note, es scheint, dass Sie Ihre Aussagen über Personen und Ihre Ontologie verschmelzen (sie den gleichen Namensraum sind Sharing). Das ist wahrscheinlich nicht das, was Sie wollen, in der Regel Ihre Schüler, Klasse und Projekt Individuen wären URIs (oder anonymer Knoten) in einem anderen Namespace. Zum Beispiel:

<?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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top