Как написать правило 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]
.
.  

1 ответ

Решение

Правило

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

не делает то, что вы ожидаете, и вполне возможно, что некоторые опечатки тоже. В вашей онтологии (в будущем, пожалуйста, предоставьте код, который мы на самом деле можем скопировать и вставить, например, сериализацию TTL или OWL/FSS), у вас есть класс с именем user, а не users, но в вашем правиле вы говорите о пользователях, Но даже если это будет исправлено, вы не получите желаемых результатов, потому что вы используете IRI там, где вам нужно использовать переменные. Ваше правило гласит, что

  • если тройка :users:hasLocation:home не отображается на графике,
  • затем на график должны быть добавлены трижды: исполнительные механизмы: hasLocation: home и : исполнительные механизмы: состояние "OFF"^^xsd: логическое значение.

Я думаю, что вы хотите правило, которое гласит:

  • если?x является приводом и имеет местоположение дома, и нет пользователей, которые имеют тот же дом, что и местоположение,
  • тогда состояние привода должно быть отключено.

Это было бы больше похоже на:

[(?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"]

Обратите внимание, что я удалил тип ^^xsd:boolean из "OFF", потому что "OFF" не является допустимой лексической формой для логического типа данных. Вместо этого вы можете использовать "true" или "false".

Другие вопросы по тегам