Джесс: Получение факта-идентификатора уже подтвержденного факта?
Поэтому, когда вы утверждаете уже утвержденный факт в Jess, а не утверждаете, возвращая id этого факта, он возвращает FALSE. Кажется, в Java вы можете использовать "findFactByFact", который, как я полагаю, подходит, но как мне это использовать, если у меня нет факта? Когда я пытаюсь передать экземпляр шаблона в функцию Java, все, что передается, это имя шаблона в строковом формате...
2 ответа
Таким образом, я обошел проблему, передав все содержимое фактов в метод Java, создав дублирующий факт и используя этот дублирующий факт для поиска исходного факта. Но это громоздко, так как мне, возможно, понадобится несколько методов, чтобы выполнить это для разных типов фактов. Я надеялся, что есть способ просто утвердить факт в Jess и получить существующий идентификатор факта, если он уже существует, а не FALSE.
Есть ли какая-то убедительная причина для получения идентификатора факта? (Я сомневаюсь в этом - по крайней мере, я никогда не чувствовал потребности.)
Тем не мение. Простая функция, приведенная ниже, либо возвращает идентификатор факта ранее заявленного факта, соответствующего аргументу факт-как-строка, либо nil.
(deffunction find-id (?aFact)
(eval (str-cat "(defquery search ?f<-" ?aFact ")"))
(bind ?result (run-query* search))
(if (?result next) then
(return (call (?result get f) getFactId))
else
(return nil)))
Учитывая определение факта
(deftemplate paper (slot author ) (slot number))
(deftemplate review (slot reviewer) (slot paper))
(deffacts MAIN::myfacts
(paper (author Joe)(number 1))
(review (reviewer "1") (paper 1))
(review (reviewer "2") (paper 1))
(review (reviewer "3") (paper 1))
(paper (author Jack)(number 2))
(review (reviewer "1") (paper 2))
(review (reviewer "2") (paper 2))
)
мы можем выполнить
(reset)
(printout t "id=" (find-id "(paper (author Joe)(number 1))") crlf)
(printout t "id=" (find-id "(review (reviewer \"2\")(paper 2))") crlf)
(printout t "id=" (find-id "(paper (author Fred)(number 3))") crlf)
чтобы получить
id=1
id=7
id=nil