我与很多人有本体论,并使用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>
这是第一条规则的结果(标识为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>
答案 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')]