Вопрос

У меня есть онтология с большим количеством людей, и я использую Jena reasoner для получения информации о них.Моя цель состоит в том, чтобы создать новых пользователей на основе предоставленной информации внутри этих правил и присвоить им свойства.Отдельные лица не обязательно должны быть названы, но им нужен тип и они должны быть частью нескольких свойств.На данный момент я могу создавать анонимных пользователей (с помощью сообщение в списке рассылки), но я могу присвоить им только один тип или одно свойство.

Вот небольшой пример моей проблемы;мое правило выглядит следующим образом (онтологию и предполагаемый результат можно найти внизу):

[тест2:(?X rdf:тип NS:Test1) ->
    [(?Y rdf:тип NS:Test2) <- макеСколем(?Y, ?X)]]

Это означает, что когда найден пользователь Test1, создается новый пустой узел, а затем этому узлу присваивается тип Test2.Это работает нормально, но я хочу присвоить этим новым индивидам классификацию и указатель (свойство) на ?X (индивиды Test1).

Что-то вроде следующего не работает, поскольку "обратные правила допускают только одно предложение head".Однако каждое предложение в отдельности работает совершенно нормально.

[тест2:(?X rdf:тип NS:Test1) ->
    [(?Y rdf:тип NS:Test2), (?Y NS:hasClassification 'тест'), <- макеСколем(?Y, ?X)]]

Это моя онтология:

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

Это результат применения первого правила (пустые узлы с идентификаторами A0 и A1 являются ли новые индивидуумы):

<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>
Это было полезно?

Решение

Во-первых, обратите внимание, что ваше правило выполняет не совсем то, что вы сказали.

[тест2:(?X rdf:введите NS:Test1) →
    [(?Y rdf:тип NS:Test2) ← makeSkolem(?Y, ?X)]]

Это означает, что когда найден пользователь Test1, создается новый пустой узел, а затем этому узлу присваивается тип Test2.

Правило совпадает, когда найден экземпляр NS:Test1, и добавляет новое правило обратной цепочки, которое можно использовать при определении того, имеет ли что-либо тип NS:Test2:если это сколем из ?X, то у него такой тип.Это не дает ничего типа NS:Test2, если вы не попросите об этом.(Написание всей модели, конечно, требует таких троек.)

Если вы находите такой тип поведения приемлемым, вы могли бы просто использовать правило прямой цепочки, которое добавляет несколько правил обратной цепочки, например:

[тест2:
  (?X rdf:введите NS:Test1) →
    [(?Y rdf:тип NS:Test2) ← makeSkolem(?Y, ?X)],
    [(?Y NS:hasClassification 'тест') ← makeSkolem(?Y, ?X)]
]

Я думаю, что это немного сложнее, чем должно быть.Объекты Skolem - это просто объекты, которые однозначно определяются некоторыми другими значениями, поэтому вы можете использовать makeSkolem в предварительных условиях правила, а также в заголовке правила.Это означает, что вы можете сделать это:

[тест2:(?X rdf:введите NS:Test1), makeSkolem(?Y, ?X) →
    (?Y rdf:тип NS:Test2), (?Y rdf:тип NS:hasClassification 'тест')]

Стоит отметить, что makeSkolem принимает произвольное количество аргументов.Возможно, стоит добавить какой-нибудь индикатор, чтобы вы случайно не получили один и тот же объект skolem в нескольких местах.Например, если бы у вас было что-то вроде

[(?дочерний rdf:тип :дочерний), makeSkolem(?мать, ?дочерний) →
    (?mother rdf:тип :мать), (?child :hasMother ?мать)]

[(?дочерний rdf:тип :дочерний), makeSkolem(?отец, ?дочерний) →
    (?father rdf:тип :Отец), (?child :hasFather ?отец)]

тогда вы на самом деле создавали бы просто один сколем объект для каждого дочернего элемента и назовем его матерью и отцом ребенка, что, вероятно, не то, чего вы хотите.Вместо этого вы могли бы сделать что-то вроде:

[(?дочерний rdf:тип :дочерний), makeSkolem(?mother, ?child, 'мать') →
    (?mother rdf:тип :мать), (?child :hasMother ?мать)]

[(?дочерний rdf:тип :дочерний), makeSkolem(?отец, ?дочерний, 'отец') →
    (?father rdf:тип :Отец), (?child :hasFather ?отец)]

с тех пор как (?child, 'mother') и (?child, 'father') всегда разные, вы получаете два объекта skolem вместо одного.Вы могли бы использовать что-то подобное в своем правиле, чтобы получить, например,

[тест2:(?X rdf:введите NS:Test1), makeSkolem(?Y, ?X, 'test2') →
    (?Y rdf:тип NS:Test2), (?Y NS:hasClassification 'тест')]

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top