因此,当您在Jess中断言已经断言的事实时,不是断言返回该事实的id,而是返回FALSE。在Java中你似乎可以使用“findFactByFact”,我认为是这样,但如果我没有这个事实,我该如何使用它呢?当我尝试将模板实例传递给java函数时,传递的所有内容都是字符串格式的模板名称......
答案 0 :(得分:1)
所以我通过将事实的所有内容传递给Java方法,构造重复的事实,并使用这个重复的事实来查找原始事实来解决问题。但它很麻烦,因为我可能需要多种方法来完成不同类型的事实。我所希望的是,有一种方法可以简单地在Jess中断言一个事实,并获得现有的事实id,如果它已经存在,而不是FALSE。
答案 1 :(得分:0)
是否有一些令人信服的理由获得事实ID? (我对此表示怀疑 - 至少,我从未感到需要。)
然而。下面的简单函数要么返回先前声明的与fact-as-string参数匹配的事实的事实id,要么返回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