Rdf 在Jena规则内创建个人

Rdf 在Jena规则内创建个人,rdf,jena,owl,blank-nodes,jena-rules,Rdf,Jena,Owl,Blank Nodes,Jena Rules,我有一个有很多个人的本体论,并使用Jena reasoner获取关于他们的信息。我的目标是根据规则中的给定信息创建新的个体,并为其分配属性。个体不需要命名,但它们需要一个类型,并且必须是一些属性的一部分。目前,我可以创建匿名个人(在a的帮助下),但我只能给他们一种类型或一个属性 这里有一个我的问题的小例子;我的规则如下所示(可以在底部找到本体和推断结果): [test2:(?X rdf:type NS:Test1)-> [(?Y rdf:typens:Test2)首先,请注意,您的规则并没有完全

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

这里有一个我的问题的小例子;我的规则如下所示(可以在底部找到本体和推断结果):

[test2:(?X rdf:type NS:Test1)->

[(?Y rdf:typens:Test2)首先,请注意,您的规则并没有完全按照您所说的那样执行

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

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

该规则在找到NS:Test1的实例时匹配,并添加一个新的反向链接规则,该规则可用于确定某个对象是否具有NS:Test2类型:如果它是?X的skolem,则它具有该类型。除非您要求,否则它不会给出任何NS:Test2类型的对象。(当然,编写整个模型时需要这样的三元组。)

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

[测试2:
(?X rdf:type 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)和rightarrow;
(?Y rdf:类型NS:测试2),(?Y rdf:类型NS:分类“测试”)]

值得注意的是,makeSkolem具有任意数量的参数。添加某种指示符可能是值得的,这样您就不会意外地在多个位置获得相同的skolem对象。例如,如果您有

[(?child rdf:type:child),makeSkolem(?mother,?child)和rightarrow;
(?母亲rdf:类型:母亲),(?子女:hasMother?母亲)]

[(?child rdf:type:child),makeSkolem(?父,子)和rightarrow;
(?父亲rdf:类型:父亲),(?子女:hasFather?父亲)]

然后,您实际上会为每个孩子创建一个skolem对象,并将其称为孩子的母亲和父亲,这可能不是您想要的。相反,您可以执行以下操作:

[(?child-rdf:type:child),makeSkolem(?mother,?child,'mother')→
(?母亲rdf:类型:母亲),(?子女:hasMother?母亲)]

[(?child-rdf:type:child),makeSkolem(?父、?子、'父')→
(?父亲rdf:类型:父亲),(?子女:hasFather?父亲)]

由于(
?child
“母亲”
)和(
?child
“父亲”
)总是不同的,因此您会得到两个skolem对象,而不仅仅是一个。您可以在规则中使用类似的内容来获取,例如

[test2:(?X rdf:type NS:Test1)、makeSkolem(?Y,?X,'test2')和rightarrow;
(?Y rdf:类型NS:测试2),(?Y NS:分类“测试”)]


我使用反向链接规则是因为在makeSkolum()之前,我使用的是makeInstance(),它只在反向/混合规则中可用。在尝试使用makeInstance()一整天之后,我没有想到在makeSkolum()中使用一个简单的正向规则。虽然它工作得非常好,但非常简单(也是为了您的第二个解释).关于耶拿,我还有很多东西要学,我很感谢你第二次帮助我。希望我在不久的将来不再需要帮助。你想回答这个问题,这样我就可以把它标记为解决了,并给你应得的荣誉吗?我很高兴这有帮助!我已经添加了它的本质作为答案。