如何编写 Jena 规则来查询 class 并获取 属性 的个人

How to write Jena rule to query class and get individuals for a property

如何提取家中无人时所有关闭的执行器。我尝试编写 Jena 规则,但无法获得正确的输出。我已经添加了我想要的期望结果。需要帮助编写规则。

[rule1: noValue(:users :hasLocation :home) -> 
(:actuators :hasLocation :home) 
(:actuators :state "OFF"^^xsd:boolean)]  

[rule2: noValue(:users :hasLocation :home) -> 
(?x rdf:type :actuators)  
(?x :hasLocation :home) 
(?x :state "OFF"^^xsd:boolean)]

{ rulex: [noValue(:subject1 :hasPropertyP2 :Object1) -> 
  (:subject2 :hasProperty1 :Object2) 
  (:subject2 :hasPropertyP3 Object3)] }

Ontology: 

class:user
Individual user_1 -> user
Individual user_2 -> user
.
.
class: actuators
subclass: ac -> actuators
subclass: light -> actuators
subclass: other -> actuators

Individual central_ac -> ac
Individual room_lighting -> light
Individual tv -> other
Individual refridgration -> other
Individual heater -> other

result for rule1 [:actuators :state "OFF"^^xsd:boolean]
result for rule2 [:4e62503a:14b01762f42:-7eea :state "OFF"^^xsd:boolean]

desired result:
[central_ac :state "OFF"^^xsd:boolean]
[room_lighting :state "OFF"^^xsd:boolean]
[tv :state "OFF"^^xsd:boolean]
.
.  

规则

[rule1: noValue(:users :hasLocation :home) -> 
        (:actuators :hasLocation :home) 
        (:actuators :state "OFF"^^xsd:boolean)] 

没有达到您的预期,而且很可能还有一些错别字。在你的 ontology 中(将来请提供我们可以实际复制和粘贴的代码,例如 TTL 序列化或 OWL/FSS),你有一个 class 称为 user,不是 users,但在您的规则中,您谈论的是 users。但即使纠正了这一点,您也不会得到想要的结果,因为您在需要使用变量的地方使用 IRI。你的规则说

  • if 三元组 :users :hasLocation :home not 是否出现在图表中,
  • 然后 三元组 :actuators :hasLocation :home:actuators :state "OFF"^ ^xsd:boolean 应该添加到图中。

我认为您想要一条规则:

  • if ?x是一个actuator并且有home的位置,并且没有home和location相同的用户,
  • then执行器的状态应该设置为off.

那看起来更像是:

[(?actuator rdf:type :actuator)
 (?actuator :hasLocation ?home)
 noValue(?user,:hasLocation,?home)
 ->
 (?actuator :state "OFF")]

这将开始在图表中显示结果,例如

[:central_ac :state "OFF"]
[:room_lighting :state "OFF"]
[:tv :state "OFF"]

请注意,我从 "OFF" 中删除了 ^^xsd:boolean 数据类型,因为 "OFF" 不是布尔数据类型的有效词法形式。您可以改用 "true""false"