Criar Indivíduos dentro de Jena Regras
-
23-12-2019 - |
Pergunta
Eu tenho uma ontologia com um monte de pessoas e usar o Jena italiano, para obter informações sobre eles.Meu objetivo é criar novos indivíduos com base na informação dada por dentro do que regras e atribuir propriedades a eles.Os indivíduos não têm de ser chamado, mas eles precisam de um tipo e tem que ser parte de algumas propriedades.No momento em que eu pode criar indivíduos anônimos (com a ajuda de um lista de discussão do post), mas só posso dar-lhes um tipo, ou uma propriedade.
Aqui está um pequeno exemplo do meu problema;minha regra é parecido com este (a ontologia e compreender o resultado pode ser encontrada na parte inferior):
[teste2:(?X rdf:type NS:Teste1) ->
[(?Y rdf:type NS:Teste2) <- makeSkolem(?Y, ?X)]]
Isso significa que quando um Test1 indivíduo é encontrado, em seguida, um novo nó em branco é criado e, em seguida, o tipo de Test2 é dada para esse nó.Ele funciona bem, mas eu quero dar a este novo indivíduos de uma classificação e de um ponteiro(propriedade) para ?X (Test1 indivíduos).
Algo como o seguinte não funciona, uma vez que, "para trás regras só permitem uma cabeça cláusula".Cada cláusula para a sua funciona perfeitamente, porém.
[teste2:(?X rdf:type NS:Teste1) ->
[(?Y rdf:type NS:Teste2), (?Y NS:hasClassification 'teste'), <- makeSkolem(?Y, ?X)]]
Este é o meu ontologia:
<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 é o resultado com a primeira regra (em branco nós com IDs A0
e A1
são os novos indivíduos):
<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>
Solução
Primeiro, note que a sua regra de não fazer exatamente o que você disse não.
[teste2:(?X rdf:type NS:Teste1) →
[(?Y rdf:type NS:Teste2) ← makeSkolem(?Y, ?X)]]Isso significa que quando um Test1 indivíduo é encontrado, em seguida, um novo nó em branco é criado e, em seguida, o tipo de Test2 é dada para esse nó.
A regra corresponde a quando um instanceof NS:Teste1 é encontrado, e adiciona uma nova regra de encadeamento para trás que pode ser usado para determinar se algo do tipo NS:Teste2:se é o de skolem ?X, então tem que escrever.Não dê nada do tipo NS:Teste2, a menos que você pergunte para ele.(Redação todo o modelo, é claro, pedir para tais triplos.)
Se você encontrar esse tipo de comportamento aceitável, você poderia simplesmente usar uma regra de encadeamento para a frente que adiciona várias regras de encadeamento para trás, por exemplo:
[teste2:
(?X rdf:type NS:Teste1) →
[(?Y rdf:type NS:Teste2) ← makeSkolem(?Y, ?X)],
[(?Y NS:hasClassification 'teste') ← makeSkolem(?Y, ?X)]
]
Eu acho que é um pouco mais complicado do que precisa ser.Skolem objetos são simplesmente objetos que são exclusivamente determinada por alguns outros valores, assim você pode usar makeSkolem no pré-condições de uma regra, bem como o chefe de uma regra.Isso significa que você pode fazer isso:
[teste2:(?X rdf:type NS:Teste1), makeSkolem(?Y, ?X) →
(?Y rdf:type NS:Teste2), (?Y rdf:type NS:hasClassification 'teste')]
Vale a pena notar que makeSkolem leva um número arbitrário de argumentos.Pode ser útil para adicionar algum tipo de indicador de modo que você não acidentalmente o mesmo skolem objeto em vários lugares.E. g., se você tinha algo como
[(?criança rdf:type :Criança), makeSkolem(?mãe ?criança) →
(?mãe rdf:type :Mãe), (?criança :hasMother ?mãe)][(?criança rdf:type :Criança), makeSkolem(?pai ?criança) →
(?pai rdf:type :Pai), (?criança :hasFather ?pai)]
então você gostaria de ser, na verdade, a criação de apenas um skolem objeto para cada Criança e chamando-o de Filho de Pai e Mãe, que provavelmente não é o que você quer.Em vez disso, você poderia fazer algo como:
[(?criança rdf:type :Criança), makeSkolem(?mãe ?criança, 'mãe') →
(?mãe rdf:type :Mãe), (?criança :hasMother ?mãe)][(?criança rdf:type :Criança), makeSkolem(?pai ?filho, 'pai') →
(?pai rdf:type :Pai), (?criança :hasFather ?pai)]
desde que o (?child
, 'mother'
e?child
, 'father'
) são sempre diferentes, você tem duas skolem objetos, em vez de apenas um.Você pode usar algo como esta na sua regra para obter, por exemplo,
[teste2:(?X rdf:type NS:Teste1), makeSkolem(?Y, ?X, 'teste2') →
(?Y rdf:type NS:Teste2), (?Y NS:hasClassification 'teste')]