Как выбрать элементы из операции UNION в запросе sqwrl

Я могу выбрать размер s3, и он дает мне правильный ответ в правиле 1. Однако я хочу выбрать все элементы в s3. Я попробовал правило 2, но оно дает мне исключение «ошибка при выполнении запросов SQWRL: ошибка при запуске механизма правил Drools».

Моя цель состоит в том, чтобы получить все болезни, которые имеют либо рвоту, либо лихорадку. Любая помощь будет высоко оценена.

Правило 1:

Symptom(fever) ^ Symptom(vomiting) ^ Disease(?x) ^ Disease(?y) ^ has_symptom(?x, fever) ^ has_symptom(?y, vomiting)˚sqwrl:makeSet(?s1, ?x) ^ sqwrl:makeSet(?s2, ?y)˚sqwrl:union(?s3, ?s1, ?s2) ^ sqwrl:size(?n, ?s3) -> sqwrl:select(?n) 

Правило 2:

Symptom(fever) ^ Symptom(vomiting) ^ Disease(?x) ^ Disease(?y) ^ has_symptom(?x, fever) ^ has_symptom(?y, vomiting)˚sqwrl:makeSet(?s1, ?x) ^ sqwrl:makeSet(?s2, ?y)˚sqwrl:union(?s3, ?s1, ?s2) -> sqwrl:select(?s3) 

person Muzogeek    schedule 04.02.2017    source источник


Ответы (1)


Согласно документации, вы следует попытаться использовать двоичный встроенный предикат sqwrl:element(?e, ?sd) с несвязанным аргументом первого элемента ?e, т.е.:

Symptom(fever) ^ Symptom(vomiting) ^ Disease(?x) ^ Disease(?y) ^
has_symptom(?x, fever) ^ has_symptom(?y, vomiting) ^ 
sqwrl:makeSet(?s1, ?x) ^ sqwrl:makeSet(?s2, ?y) ^ sqwrl:union(?s3, ?s1, ?s2) ^
sqwrl:element(?e, ?s3)  
-> sqwrl:select(?e)
person UninformedUser    schedule 04.02.2017