介绍

Evrete 是一个前向推理的 Java 规则引擎,实现了 RETE 算法,并完全符合 Java 规则引擎规范(JSR 94)。

ps: 看来这个 rete 算法才是核心,jsr94 也可以重点关注一下。

它的特性包括:

规则编写

  • 可以使用外部和内联方式编写规则,作为普通的 Java 8 代码。
  • 引擎允许规则以 带注解的 Java 源代码、类或存档的形式编写。
  • 该库本身是一个灵活的工具,用于创建自定义领域特定的规则语言(DSL)。

直观且开发者友好

  • 库的类型系统使其能够无缝处理任何类型的对象,包括 JSON 和 XML。
  • 流畅的构建器、Java 函数式接口和其他最佳实践使开发者的代码简洁清晰。
  • 关键组件暴露为服务提供者接口,可以进行定制。

性能和安全性

  • 引擎的算法和内存经过优化,适用于大规模和带标签的数据。
  • 内置的 Java 安全管理器支持,可防止规则中的不需要或潜在恶意代码。

项目主页

官方项目描述、文档和使用示例可在 https://www.evrete.org 找到。

先决条件

Evrete 兼容 Java 8+,并且不带有任何依赖项。

安装

Maven:

  [xml]
1
2
3
4
5
<dependency> <groupId>org.evrete</groupId> <artifactId>evrete-core</artifactId> <version>3.2.00</version> </dependency>

Gradle:

  [groovy]
1
implementation 'org.evrete:evrete-core:3.2.00'

支持带注解的规则(可选)

Maven:

  [xml]
1
2
3
4
5
<dependency> <groupId>org.evrete</groupId> <artifactId>evrete-dsl-java</artifactId> <version>3.2.00</version> </dependency>

Gradle:

  [groovy]
1
implementation 'org.evrete:evrete-dsl-java:3.2.00'

快速入门

以下是一个简单的规则示例,从会话内存中删除除了素数之外的每个整数。

作为内联 Java 代码:

  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class PrimeNumbersInline { public static void main(String[] args) { KnowledgeService service = new KnowledgeService(); Knowledge knowledge = service .newKnowledge() .builder() .newRule("prime numbers") .forEach( "$i1", Integer.class, "$i2", Integer.class, "$i3", Integer.class ) .where("$i1 * $i2 == $i3") .execute(ctx -> ctx.deleteFact("$i3")) .build(); try (StatefulSession session = knowledge.newStatefulSession()) { // Inject candidates for (int i = 2; i <= 100; i++) { session.insert(i); } // Execute rules session.fire(); // Print current memory state session.forEachFact((handle, o) -> System.out.println(o)); } service.shutdown(); } }

作为带注解的 Java 源文件:

  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class PrimeNumbersDSLUrl { public static void main(String[] args) { KnowledgeService service = new KnowledgeService(); Knowledge knowledge = service .newKnowledge( "JAVA-SOURCE", new URL("https://www.evrete.org/examples/PrimeNumbersSource.java") ); try (StatefulSession session = knowledge.newStatefulSession()) { // Inject candidates for (int i = 2; i <= 100; i++) { session.insert(i); } // Execute rules session.fire(); // Printout current memory state session.forEachFact((handle, o) -> System.out.println(o)); } } }

其中规则本身被存储在外部,如 PrimeNumbersSource.java

更多详细信息请参阅官方文档

许可证

本项目使用以下许可证:MIT

参考资料

https://github.com/evrete/evrete/