Как написать правило Jena для запроса класса и получения отдельных лиц для собственности

Как извлечь все актуаторы, которые выключены, когда дома нет пользователей. Я пытался написать правило 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]
.
.  

person user3747396    schedule 21.01.2015    source источник
comment
На основе ваш комментарий к вашему предыдущему вопросу, где вы сказали, что какие люди имеют o в качестве значения свойства p? .. Это именно то, что я пытаюсь получить. вы можете просто вызвать listResourcesWithProperty(property,object). Для этого не нужны правила.   -  person Joshua Taylor    schedule 21.01.2015
comment
Для меня не имеет смысла, что вы используете имена классов в качестве субъектов во многих ваших правилах. Например, ваше правило 1 должно быть чем-то вроде [rule1: (?actuator :hasLocation ?home) noValue(?user :hasLocation ?home) -> (?actuator :state "false"^^xsd:boolean)] .   -  person Joshua Taylor    schedule 21.01.2015
comment
Правило 1 и правило 2 одинаковы, я хотел объяснить свой случай, когда я использую правило 1 для желаемого результата, я вижу результат для правила 1, а также для правила 2. У меня есть только одно правило. Rulex — это шаблон, предназначенный для объяснения моей идеи.   -  person user3747396    schedule 21.01.2015


Ответы (1)


Правило

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

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

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

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

  • если ?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".

person Joshua Taylor    schedule 21.01.2015
comment
Какая-то конкретная причина отказа? Что-то не получилось с этим предложением? - person Joshua Taylor; 22.01.2015
comment
Я хотел удалить вопрос по другим причинам и поэтому вернулся к нему. Решение идеальное. - person user3747396; 22.01.2015
comment
@user3747396 user3747396 Хотя пример был не совсем полным или минимальным, он был репрезентативным и имел разумный ответ. Я думаю, что это, вероятно, полезно для других, которые используют правила Jena. Не вижу причин, чтобы его удалять. - person Joshua Taylor; 22.01.2015