Pregunta

Estoy utilizando rowlex en mi proyecto. Tengo una propiedad asignada a un individuo en mi archivo RDF, que tiene un valor. Por ejemplo, para 'Estudiante' individual, hay una propiedad 'isMemberOf', con el valor de una clase uri 'class00021'. A continuación, quiero añadir un segundo valor de esta propiedad. Por ejemplo, un valor de 'Proyecto' 'con proj000052' uri.

El problema aparece aquí: después de añadir el segundo valor, primer valor es expulsado de la propiedad 'isMemberOf', incluso fuera de su persona (estudiante), y se almacena como un nuevo individuo

.

El código que he usado para esta operación es la siguiente:

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

El RDF resultado es como sigue:

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

... y si seguimos añadiendo, la propiedad anterior se le echa fuera. Entonces, ¿cómo puedo solucionar este problema?

¿Fue útil?

Solución

Para cada clase ontología, ROWLEX genera dos clases .NET un "completo" y una "luz" uno. Las dos clases generadas automáticamente se diferencian por la convención de nombres. Si su clase OWL se denomina "Estudiante" de la clase de luz se llamará "Estudiante", también. La clase completa se denomina "Student_". Ellos son completamente intercambiables entre sí, el gran propósito de tener dos es conveniencia. La clase completa contiene todos los métodos posibles / propiedades que necesita. La clase de la luz contiene sólo los más utilizados queridos. El problema con las clases completos que consiguen llena de gente. Para cada propiedad OWL solo obtendrá 10 propiedades y métodos de la clase en .NET (!):

  • Añadir (typesafe)
  • Añadir (no Typesafe)
  • Eliminar (typesafe)
  • Eliminar (no Typesafe)
  • Reemplazar (typesafe)
  • Reemplazar (no typesafe)
  • propiedad no array (typesafe)
  • propiedad no array (no typesafe)
  • propiedad de matriz (typesafe)
  • propiedad de matriz (no typesafe)

Si usted tiene sólo 5 propiedades OWL para atender a la clase completa .NET autogenerado tendrá 5x10 métodos / propiedades. Estos elevado número de miembros de derrotar fácilmente la utilidad de IntelliSense. Por lo tanto, generalmente se recomienda el uso de clases de luz.

En la clase de luz, que sólo tienen la propiedad de no implementado matriz (a menos que las restricciones de cardinalidad dirigen explícitamente lo contrario) y que la propiedad llama internamente al método replace. En el caso de tener que utilizar la clase completa.

Esta es la forma en que se obtiene y utiliza la clase completa (No he verificado el código):

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

Otros consejos

No estoy familiarizado con Rowlex, pero yo supongo que la cuestión es cómo va a crear su nuevo studyMemberOf predicado (o no, como parece).

La comparación:

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

y

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

parecería indicar que se está asignando un nuevo individuo a un solo predicado, en lugar de añadir una nueva declaración con el mismo predicado (que es exactamente su pregunta - No estoy seguro de cómo útil esta respuesta es).

Además, en una nota de estilo, parece que se está fusionando sus declaraciones acerca de las personas y su ontología (que están compartiendo el mismo espacio de nombres). Eso no es probablemente lo que quiere, por lo general su estudiante, clase, y los individuos proyecto sería URI (o nodos anónimos) en otro espacio de nombres. Por ejemplo:

<?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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top