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>
Foi útil?

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')]

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top