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