在耶拿规则中创建个人

时间:2014-02-27 15:06:03

标签: rdf jena owl blank-nodes jena-rules

我与很多人有本体论,并使用Jena推理器获取有关他们的信息。我的目标是根据规则中的给定信息创建新的个人,并为他们分配属性。这些人不必被命名,但他们需要一种类型,必须成为一些属性的一部分。目前我可以创建匿名个人(在mailing list post的帮助下),但我只能给他们一种类型或一个属性。

这是我的问题的一个小例子;我的规则看起来像这样(本体和推断结果可以在底部找到):

  

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

这意味着当找到Test1个体时,然后创建一个新的空白节点,然后将类型Test2赋予该节点。它工作正常,但我想给这个新个体分类和指针(属性)到?X(Test1个体)。

类似下面的内容不起作用,因为“后向规则只允许一个头条款”。它的每个条款都可以完美地使用。

  

[test2:(?X rdf:type NS:Test1) - >
  [(?Y rdf:type NS:Test2),(?Y NS:hasClassification'test'),< - makeSkolem(?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>

这是第一条规则的结果(标识为A0A1的空白节点是新个人):

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

1 个答案:

答案 0 :(得分:1)

首先,请注意您的规则并不完全符合您的说法。

  

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

     

这意味着当找到Test1个体时,会创建一个新的空白节点,然后将类型Test2提供给该节点。

当找到NS:Test1的instanceof时,规则匹配,并添加一个新的反向链规则,可以在确定某些东西是否具有NS类型时使用:Test2:如果它是?X的skolem,则它具有该类型。除非你要求,否则它不会提供任何类型的NS:Test2。 (当然,编写整个模型确实要求这样的三元组。)

如果您发现可接受的行为类型,您可以简单地使用添加多个反向链接规则的正向链规则,例如:

  

[TEST2:
  (?X rdf:类型NS:Test1)→
  [(?Y rdf:type NS:Test2)←makeSkolem(?Y,?X)],
  [(?Y NS:hasClassification'test')←makeSkolem(?Y,?X)]
  ]

我认为这比它需要的要复杂一点。 Skolem对象只是由其他一些值唯一确定的对象,因此您可以在规则的前提条件和规则的头部使用makeSkolem。这意味着你可以这样做:

  

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

值得注意的是makeSkolem接受任意数量的参数。添加某种指示器可能是值得的,这样你就不会意外地在多个地方获得相同的skolem对象。例如,如果您有类似

的内容
  

[(?child rdf:type:Child),makeSkolem(?mother,?child)→
  (?母亲rdf:类型:母亲),(?孩子:有母亲?母亲)]

     

[(?child rdf:type:Child),makeSkolem(?father,?child)→
  (?父亲rdf:类型:父亲),(?child:hasFather?father)]

那么你实际上只是为每个孩子创建一个 skolem对象并将其称为Child's Mother and Father,这可能不是你想要的。相反,你可以做类似的事情:

  

[(?child rdf:type:Child),makeSkolem(?mother,?child,'mother')→
  (?母亲rdf:类型:母亲),(?孩子:有母亲?母亲)]

     

[(?child rdf:type:Child),makeSkolem(?father,?child,'father')→
  (?父亲rdf:类型:父亲),(?child:hasFather?father)]

因为(?child'mother')和(?child'father')总是不同的,所以你得到两个skolem对象而不是一个。您可以在规则中使用类似的内容,例如

  

[test2:(?X rdf:type NS:Test1),makeSkolem(?Y,?X,'test2')→
  (?Y rdf:类型NS:Test2),(?Y NS:hasClassification'test')]