The retrieved CompiledFEELExpression could be a statically-interpretedInterpretedExecutableExpression (that wraps the original BaseNodeast) or could be a dynamically-code-generatedCompiledExecutableExpression. In the first case, evaluation is executed by the DMN code as it is statically defined. In the latter case, code is generated out of the given model. In that code, some variable will be directly written in the generated, speeding up its execution.
self.send_response(f.status) for (key, value) in f.headers.items(): if key == 'Content-Type': self.send_header(key, value) self.end_headers() data = f.read() if f.headers['Content-Encoding'] == 'gzip': data = gzip.decompress(data) data = data.decode('utf-8') # print(data) if'https'in data: data = data.replace('https://', 'http://') logger.info("data: %s", data) logger.info('<<<<: %s', self.path) data = get_answer(data) self.wfile.write(data.encode('utf-8'))
规则: IF Person.age > 18 AND NOT Order.product == "玩具" THEN ...
这条规则包含一个否定条件: NOT Order.product == "玩具",表示只有当订单中的商品不是玩具时,规则才会被触发。 在 Rete 网络中,这个规则会被分解成多个节点,其中包含一个 Not Node 用于处理否定条件。
当一个 Person 对象的 age 属性大于 18 时,会生成一个 Token 并传递到 Not Node 的左侧。
当一个 Order 对象的 product 属性等于 “玩具” 时,会生成一个 Token 并传递到 Not Node 的右侧。
Not Node 会比较这两个 Token,发现它们匹配(即否定条件成立),因此会撤销之前传递给后续节点的 Person Token。
总结: Not Node 是 Rete 算法中处理否定条件的关键机制,它通过监听多个分支的输入、比较 Token 并撤销不符合条件的数据,确保了只有满足所有条件(包括否定条件)的数据才会触发规则。
rete算法中,Conjunctive Negations如何实现
在 Rete 算法中,Conjunctive Negations(合取否定)指的是规则中包含多个否定条件,并且这些否定条件之间是 AND 关系的情况。例如:
1 2
规则:IF A > 10 AND NOT B = 20 AND NOT C = 30 THEN ...
这个规则包含两个否定条件:NOT B = 20 和 NOT C = 30, 而且它们之间是 AND 的关系,也就是说只有当 B 不等于 20 并且 C 不等于 30 时,规则才会被触发。 实现 Conjunctive Negations 的关键在于如何协调多个否定条件的匹配结果,确保只有当所有否定条件都满足时才会触发规则。 在 Rete 网络中,通常有以下几种方式实现 Conjunctive Negations: 1. 级联 Not Node:
将多个 Not Node 级联起来,每个 Not Node 负责处理一个否定条件。
第一个 Not Node 接收来自左侧节点(例如 Alpha Node 或 Beta Node)的 Token,并监听其右侧分支(匹配第一个否定条件)的输入。
如果第一个否定条件成立,则第一个 Not Node 会将 Token 传递给第二个 Not Node,否则丢弃该 Token。
第二个 Not Node 重复上述过程,直到所有 Not Node 都满足条件,才会将 Token 传递给后续节点。
这种方式简单直观,但效率较低,因为需要在多个 Not Node 之间传递 Token,增加了网络的复杂度。 2. 专用 Join Node: