标签: drools

Drools:如何在检查事实是否尚未存在于工作记忆中后插入事实

我正在使用 drools 来验证一个对象。该对象还有一个 getChildrenList() 方法,该方法返回与该对象相关的子对象(主从关系)。

我对对象进行了一些验证,然后我也想验证子对象,因此我使用以下规则将所有子对象插入到工作内存中:

 rule "Insert Children"
     when
             $parent : Parent ( eval(childrenList != empty) )
                     $ch : Child() from $p.childrenList
     then
             insert($ch);
     end
Run Code Online (Sandbox Code Playgroud)

现在,如果已经插入了子项,我如何确保该规则不会被解雇。我的意思是因为我修改了一些事实,所以规则被重新触发。我怎样才能防止这种情况发生?

谢谢

java drools

5
推荐指数
1
解决办法
3863
查看次数

快速加载流口水知识库

我正在尝试使用 Drools 作为语法关系到语义映射框架的规则引擎。规则库目前已超过 5000 条规则,并将继续扩展。目前在使用 Drools 时,每次运行程序时,读取包含规则的 drl 文件和创建知识库都会花费大量时间。有没有办法创建一次知识库并将其保存为某种持久格式,可以快速加载仅在进行更改时重新生成知识库的选项?

drools

5
推荐指数
1
解决办法
3400
查看次数

将 Java POJO 转换为 Drools DRL,反之亦然

我在 UI 上有规则配置,它构建为 Java POJO。我如何生成 Drools DRL(传递给其他组件,该组件将匹配事实等,并在规则匹配时返回 true 或 false)。

我还从数据库收到 DRL 文件,为了在 UI 上显示规则,我需要转换回 Java POJO。

基本上有没有任何工具或脚本可以在 Java POJO 和 Drools DRL 文件之间进行转换?如果没有,最好的方法是什么?

非常感谢!

java drools rule

5
推荐指数
1
解决办法
4307
查看次数

Drools 规则写作最佳实践

我一直在阅读一篇关于 Drools 性能的文章(JBoss Drools \xe2\x80\x93 Performance and Memory Internals),它解释了如何创建 Rete 树和节点,Drools 如何索引它们,以及为什么增加 Drools 中的对象数量几乎不会影响执行它所花费的总时间。\n以智能方式编写的规则可以大大减少 Rete Tree 中的节点数量,从而进一步提高性能。

\n\n

我想知道是否有 Drools 规则编写最佳实践,这样我就可以以一种可以尽快执行的方式编写它们。

\n\n

谢谢。

\n

rule-engine drools rete

5
推荐指数
1
解决办法
5603
查看次数

Drools 规则 - 针对布尔字段的书写规则,名称以“is”开头

在 drools 规则中,想要测试布尔字段 isValid 的值(注意:字段名称以“is”开头)。出现以下错误:

无法为规则“测试布尔内容”中的“[ClassObjectType class=domain.SpecialObject]”的“isValid”创建字段提取器:[规则名称=“测试布尔内容”]线程“main”中出现异常 java.lang.IllegalArgumentException:无法解析 drl 文件。

然而,规则中的另一个布尔字段“solid”工作得很好。

环境:Drools 版本 - 5.1.1,dialect=mvel

<Drl file>
import deshaw.compliance.regsys.dep.domain.SpecialObject;
dialect "mvel"
rule "Test boolean stuff"
no-loop
  when
    $obj: SpecialObject(isValid == true)  // -->Problematic guy
    //$obj: SpecialObject(solid == true)  // -->This works fine
then
   System.out.println("[SplObject]:Class=" + $obj.class + ";;;obj=" + $obj);
end

<domain object>
public class SpecialObject {

private boolean isValid;
private boolean solid;

public boolean isValid() {
    return isValid;
}

public void setValid(boolean isValid) {
    this.isValid = isValid;
}

public …
Run Code Online (Sandbox Code Playgroud)

drools

5
推荐指数
1
解决办法
1万
查看次数

无法从 DRL 更新 jbpm 流程变量

我目前开始使用 jbpm/drools 并尝试使用“业务规则任务”从我的 DRL 修改一些流程变量。我尝试了以下过程,该过程声明了“MyCustomObject”类型的变量“var”。

根据此问题此建议的结果,我创建了一个任务,该任务应执行规则流组“testgroup”并具有以下 onEntry 脚本:

kcontext.getKnowledgeRuntime().insert(kcontext.getProcessInstance());
Run Code Online (Sandbox Code Playgroud)

我的 DRL 现在看起来像这样:

import mypackage.MyCustomObject;
import org.kie.api.runtime.process.WorkflowProcessInstance;

rule "generate object"
ruleflow-group "testgroup"

when
  //some stuff applies
then
  insert(new MyCustomObject());
end

rule "modify variable"
ruleflow-group "testgroup" 

when
  $process: WorkflowProcessInstance()
  $obj: MyCustomObject()
then
  WorkflowProcessInstance $p = (WorkflowProcessInstance)kcontext.getKieRuntime().getProcessInstance($process.getId());
  $p.setVariable( "var", $obj);
  System.out.println("Value of object in memory: "+$obj);
  System.out.println("Value of object in variable:+$p.getVariable("var"));
  retract($process);
end
Run Code Online (Sandbox Code Playgroud)

在业务规则任务之后,我放置了一个简单的脚本任务:

if(var != null) {
  System.out.println("var: "+var);
} else{
  System.out.println("var is null!");  
}
Run Code Online (Sandbox Code Playgroud)

我现在得到的输出是(注意:MyCustomObject 不会覆盖 toString):

内存中对象的值:MyCustomObject@XYZ …

drools jbpm kie-wb

5
推荐指数
1
解决办法
1884
查看次数

Drools 规则条件 - 检查属性是否为空

我有一个相当简单的情况,我想检查规则条件中属性是否不为空。

rule "only do action if attribute is not null"
when
    $fact : Fact(attribute!=null, $attribute : attribute)
then
    rulesLogger.debug("Rule fires = " + $attribute);
end
Run Code Online (Sandbox Code Playgroud)

我已经在调试中跟踪了这一点。正在插入属性为 null 的事实,但规则仍会触发。控制台输出如下。

Rule fires = null
Run Code Online (Sandbox Code Playgroud)

如果我将条件更改为,attribute==null则规则不会触发。所以它的表现似乎与我的预期完全相反。

我们确实有一个使用函数来解决这个问题的方法,但它有点丑陋,我不明白为什么它首先不起作用。

function Boolean attributeExists(Fact fact)
{
    if(fact.getAttribute() == null)
    {
        return Boolean.FALSE;
    }
    else
    {
        return Boolean.TRUE;
    }
}

rule "only do action if attribute is not null"
when
    $fact : Fact($attribute : attribute)
    Boolean(booleanValue == true) from attributeExists($fact)
then
    rulesLogger.debug("Rule fires = " + …
Run Code Online (Sandbox Code Playgroud)

java drools

5
推荐指数
1
解决办法
1万
查看次数

NoSuchMethodError 由于番石榴罐

我收到 NoSuchMethodError

错误是:

Caused by: java.lang.NoSuchMethodError: com.google.common.cache.CacheBuilder.maximumSize(J)Lcom/google/common/cache/CacheBuilder;
    at springfox.documentation.spring.web.scanners.CachingOperationReader.<init>(CachingOperationReader.java:44) ~[springfox-spring-web-2.7.0.jar:2.7.0]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_172]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_172]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_172]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_172]
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:170) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    ... 60 common frames omitted
Run Code Online (Sandbox Code Playgroud)

我认为错误的原因是因为 CacheBuilder 在两个 jar 中可用。我正在构建一个带有流口水和招摇的弹簧靴产品。我的依赖项列表包含以下依赖项

    <dependency>
        <groupId>org.kie</groupId>
        <artifactId>kie-ci</artifactId>
        <version>${kie.version}</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>${swagger.version}</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

现在kie-cisisu-guavaswaggerguava罐子,我发现通过运行

mvn dependency:tree -Dverbose | grep guava

$ mvn dependency:tree -Dverbose | grep guava
[INFO] |  |  |        \- org.sonatype.sisu:sisu-guava:jar:0.9.9:compile
[INFO]    +- com.google.guava:guava:jar:18.0:compile
Run Code Online (Sandbox Code Playgroud)

依赖树的输出是

$ mvn …
Run Code Online (Sandbox Code Playgroud)

java drools spring-boot swagger-2.0

5
推荐指数
1
解决办法
606
查看次数

无法在 Eclipse 中使用 Drools

我了解最新版本的 Drools (7.47) 取消了 Eclipse Java 编译器的范围(https://docs.jboss.org/drools/release/7.47.0.Final/drools-docs/html_single/#drools-ecj),但是这个破坏了与 Eclipse 的集成。我不再在 .drl 文件中进行语法/错误解析,无法显示 Rete 树,并且该项目存在构建错误:

java.lang.ClassNotFoundException: org.drools.ecj.EclipseJavaCompiler cannot be found by org.drools.eclipse_7.47.0.Final

(这个错误对于Rete树和构建项目是一样的)

这是 Drools 中的一个错误,将在下一版本中修复,还是我需要解决的配置问题?如果是配置问题,我需要做什么?

eclipse drools

5
推荐指数
0
解决办法
1096
查看次数

在Drools 6中从数据库加载和更新规则

如何在启动时从数据库表加载规则并从Drools 6.2.0中的同一个表更新它们?我找到了一个使用Drools 5 的例子,我可以将其从Scala转换为Java,但看起来API已经发生了巨大变化......例如,我没有看到RuleBaseFactory类.

任何样品或文件将不胜感激.

java drools

4
推荐指数
2
解决办法
9025
查看次数

标签 统计

drools ×10

java ×5

eclipse ×1

jbpm ×1

kie-wb ×1

rete ×1

rule ×1

rule-engine ×1

spring-boot ×1

swagger-2.0 ×1