Pregunta

Tengo una ontología con una gran cantidad de personas y el uso de la Jena razona para obtener información acerca de ellos.Mi objetivo es crear nuevos individuos sobre la base de la información dada en el interior de que las normas y asignar propiedades a ellos.Los individuos no tienen que ser nombrado, pero que necesitan un tipo y tienen que ser parte de un par de propiedades.En el momento en el que puedo crear individuos anónimos (con la ayuda de un lista de correo de post), pero sólo puedo darles un tipo, o una propiedad.

He aquí un pequeño ejemplo de mi problema;mi regla se parece a esto (la ontología y se infiere que los resultados pueden ser encontrados en la parte inferior):

[test2:(?X rdf:type NS:Prueba1) ->
[(?Y rdf:type NS:Test2) <- makeSkolem(?Y, ?X)]]

Esto significa que, cuando un Test1 individuo se encuentra, a continuación, un nuevo espacio en blanco se crea un nodo y, a continuación, el tipo Test2 a ese nodo.Funciona bien, pero quiero dar a este nuevo individuos de una clasificación y un puntero(propiedad) a ?X (el Test1 individuos).

Algo como la siguiente no funciona, ya que "hacia atrás reglas sólo permiten una cabeza de la cláusula".Cada una de las cláusulas para su funciona perfectamente bien.

[test2:(?X rdf:type NS:Prueba1) ->
[(?Y rdf:type NS:Test2), (?Y NS:hasClassification 'prueba'), <- makeSkolem(?Y, ?X)]]

Este es mi ontología:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns="file:/Test#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" > 
  <rdf:Description rdf:about="file:/Test#hasClassification">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#DatatypeProperty"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#TestProp">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#testInd">
    <rdf:type rdf:resource="file:/Test#Test1"/>
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#NamedIndividual"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#testInd2">
    <rdf:type rdf:resource="file:/Test#Test1"/>
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#NamedIndividual"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#Test1">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#Test2">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Ontology"/>
  </rdf:Description>
</rdf:RDF>

Este es el resultado con la primera regla (en blanco con los Identificadores de los nodos A0 y A1 son los nuevos individuos):

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns="file:/Test#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" > 
  <rdf:Description rdf:about="file:/Test#hasClassification">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#DatatypeProperty"/>
  </rdf:Description>
  <rdf:Description rdf:nodeID="A0">
    <rdf:type rdf:resource="file:/Test#Test2"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#TestProp">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#testInd">
    <rdf:type rdf:resource="file:/Test#Test1"/>
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#NamedIndividual"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#testInd2">
    <rdf:type rdf:resource="file:/Test#Test1"/>
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#NamedIndividual"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#Test1">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#Test2">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
  </rdf:Description>
  <rdf:Description rdf:nodeID="A1">
    <rdf:type rdf:resource="file:/Test#Test2"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Ontology"/>
  </rdf:Description>
</rdf:RDF>
¿Fue útil?

Solución

En primer lugar, tenga en cuenta que su regla de no hacer exactamente lo que usted ha dicho que sí.

[test2:(?X rdf:type NS:Prueba1) →
[(?Y rdf:type NS:Test2) ← makeSkolem(?Y, ?X)]]

Esto significa que, cuando un Test1 individuo se encuentra, a continuación, un nuevo espacio en blanco se crea un nodo y, a continuación, el tipo Test2 a ese nodo.

La regla se cumple cuando un instanceof NS:Prueba1 se encuentra, y añade una nueva regla de encadenamiento hacia atrás que puede ser utilizado al momento de determinar si algo tiene el tipo NS:Test2:si es la de skolem ?X, entonces se tiene que escribir.No dar nada el tipo NS:Test2 a menos que usted se lo pide.(La redacción de todo el modelo, por supuesto, pide que tales triples.)

Si usted encuentra que el tipo de comportamiento aceptable, usted puede simplemente utilizar un encadenamiento de reglas que añade múltiples atrás de encadenamiento de reglas, por ejemplo:

[test2:
(?X rdf:type NS:Prueba1) →
[(?Y rdf:type NS:Test2) ← makeSkolem(?Y, ?X)],
[(?Y NS:hasClassification 'prueba') ← makeSkolem(?Y, ?X)]
]

Creo que es un poco más complicado de lo que debe ser.Skolem objetos son simplemente objetos que se determina únicamente por algunos otros valores, así que usted puede utilizar makeSkolem en las condiciones de una regla como la cabeza de una regla.Esto significa que usted puede hacer esto:

[test2:(?X rdf:type NS:Prueba1), makeSkolem(?Y, ?X) →
(?Y rdf:type NS:Test2), (?Y rdf:type NS:hasClassification 'prueba')]

Vale la pena señalar que makeSkolem toma un número arbitrario de argumentos.Podría ser interesante añadir algún tipo de indicador para que no accidentalmente conseguir el mismo skolem objeto en múltiples lugares.E. g., si había algo como

[(?niño rdf:type :Niño), makeSkolem(?madre, ?niño) →
(?madre rdf:type :Madre), (?niño :hasMother ?madre)]

[(?niño rdf:type :Niño), makeSkolem(?padre, ?niño) →
(?padre rdf:type :Padre), (?niño :hasFather ?padre)]

entonces quieres ser en realidad la creación de sólo uno skolem objeto para cada Niño y llamando a la Madre del Niño y el Padre, que probablemente no es lo que usted desea.En lugar de eso, se podría hacer algo como:

[(?niño rdf:type :Niño), makeSkolem(?madre, ?niño, 'madre') →
(?madre rdf:type :Madre), (?niño :hasMother ?madre)]

[(?niño rdf:type :Niño), makeSkolem(?padre, ?niño, el 'padre') →
(?padre rdf:type :Padre), (?niño :hasFather ?padre)]

desde (?child, 'mother') y (?child, 'father') son siempre diferentes, se obtienen dos skolem objetos en lugar de uno solo.Puede usar algo como esto en la regla para obtener, por ejemplo,

[test2:(?X rdf:type NS:Prueba1), makeSkolem(?Y, ?X, 'prueba2') →
(?Y rdf:type NS:Test2), (?Y NS:hasClassification 'prueba')]

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top