介绍

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:

<dependency>
    <groupId>org.evrete</groupId>
    <artifactId>evrete-core</artifactId>
    <version>3.2.00</version>
</dependency>

Gradle:

implementation 'org.evrete:evrete-core:3.2.00'

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

Maven:

<dependency>
    <groupId>org.evrete</groupId>
    <artifactId>evrete-dsl-java</artifactId>
    <version>3.2.00</version>
</dependency>

Gradle:

implementation 'org.evrete:evrete-dsl-java:3.2.00'

快速入门

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

作为内联 Java 代码:

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 源文件:

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/