`
Audion
  • 浏览: 13607 次
  • 性别: Icon_minigender_1
  • 来自: 济南
文章分类
社区版块
存档分类
最新评论

Drools中多嵌套对象的处理

 
阅读更多
原来的文章就曾经提到过,在drools中,域约束好像只能适用于对象的简单类型域,复杂对象类型的是不能用域限定方式来做的。如:
rule "WEEKDAY_BALANCE"  
    salience 0  
    when  
        $customer : Customer( $card : card ) 
        $scard : $card( discount == 0.9 )
    then   
        System.out.println("...");
end  

其中,card域就是一个“复杂”对象。那么上面的rule就是不合法的。
这个问题困扰多时,请教过dada,得知可以用eval来解决(或者,在3.1M中可以用from解决)。可处理了一些之后感觉还是有问题,尤其是一个对象中有多个“复杂”对象的时候。例如下面:
public class ProjMem {

	private Project proj;

	private Member mem;
}

这个类中的两个成员都是“复杂”对象。他们表征了一个项目参与关系。现在我想要实现这样的判断:如果一个成员mem(有id,name等属性)参与了2个或者以上的类型tp的项目proj(有id,type等属性),那么输出错误。可是怎么想也不知道该如何处理?!!!

这个答案在3.06版和3.1M版中的解决方案应该不一样吧?分别应该怎么解决呢?哪位高手可以指导一下?
谢谢了。。。
分享到:
评论
11 楼 dada 2007-04-24  
Audion 写道


非常感谢dada费心解决。这个解决方案目前大概是最好的了。只是只能将别的对象作为Collection类型的集合的话还是颇感不便!不知道以后还会不会遇到更郁闷的问题。唉。。。


我觉得首先要确定项目中规则引擎处理的问题域,不同业务的问题域都不尽相同。我是以“规则是否可以提供比JAVA更高的开发效率”为原则来确定问题域。拿你的这个需求举例,在给memeber添加project或者project添加member的时候就可以直接抛出业务异常,还硬用规则解决总给人怪怪的感觉。
10 楼 Audion 2007-04-24  
Godlikeme 写道
埃,要在lhs写这么复杂的东西。


这个 from accumulate和from collect等是3.1M中新加入的呢。ms就是为了方便在lhs里来方便表达的。如果不在lsh里写好限制条件,你用if……else写的一大堆逻辑要怎么样等价的表达呢?
9 楼 Godlikeme 2007-04-24  
埃,要在lhs写这么复杂的东西。
8 楼 Audion 2007-04-23  
dada 写道
POJO

#created on: 2007-4-23
package composite

import com.sample.support.Member;
import com.sample.support.Project;


rule "sample"
	when
		$member : Member()
		$bar : Integer()
					from accumulate($project : Project( type == "foo", memebers contains $member),
									init(int foo = 0;),
									action(foo++;),
									result(new Integer(foo)))
	then 
        System.out.println("catch it - " + $member);
		System.out.println($bar);
end

不知道lz是不是这个意思呢?


非常感谢dada费心解决。这个解决方案目前大概是最好的了。只是只能将别的对象作为Collection类型的集合的话还是颇感不便!不知道以后还会不会遇到更郁闷的问题。唉。。。

7 楼 dada 2007-04-23  
POJO
public class Member {

	private Long id;
	
	private String name;

	private Set projects = new HashSet();
	
	//omit...

	public String toString() {
		return "成员 :" + name;
	}
	
}
public class Project {

	private Long id;
	
	private String name;
	
	private String type;

	private Set memebers = new HashSet();
	
	//omit...

	public String toString() {
		return "项目 :" + name;
	}
	
}

RULE
#created on: 2007-4-23
package composite

import com.sample.support.Member;
import com.sample.support.Project;


rule "sample"
	when
		$member : Member()
		$bar : Integer()
					from accumulate($project : Project( type == "foo", memebers contains $member),
									init(int foo = 0;),
									action(foo++;),
									result(new Integer(foo)))
	then 
        System.out.println("catch it - " + $member);
		System.out.println($bar);
end

不知道lz是不是这个意思呢?
6 楼 Audion 2007-04-23  
dada 写道
Audion 写道


能针对我的问题给点解决方案么?我现在还没有找到一种可行的办法!相当郁闷啊!!

最好的方法是这块别放在规则引擎里面。如果一定要用规则引擎的话晚上放一段3.1M1的写法,3.0.X很难处理这种情况。


3.1M的也可以啊!现在就是解决不了啊!麻烦你贴一个吧。拜托啦!!!
5 楼 Godlikeme 2007-04-23  
难!,ilog使用临时变量支持这个,也不是很好。
业务对象是如何使用的呢,直接使用pojo?
我是在外面套了一个rulewrapper,直接处理各种rule engine不兼容带来的问题,要写一大堆delegate。。。只能寄希望这样处理的属性不太多,
4 楼 dada 2007-04-23  
Audion 写道


能针对我的问题给点解决方案么?我现在还没有找到一种可行的办法!相当郁闷啊!!

最好的方法是这块别放在规则引擎里面。如果一定要用规则引擎的话晚上放一段3.1M1的写法,3.0.X很难处理这种情况。
3 楼 Audion 2007-04-23  
sonic_yj 写道
Audion 写道
原来的文章就曾经提到过,在drools中,域约束好像只能适用于对象的简单类型域,复杂对象类型的是不能用域限定方式来做的。如:


认识基本相同,这么复杂的对象不管在用什么都需要小心



能针对我的问题给点解决方案么?我现在还没有找到一种可行的办法!相当郁闷啊!!
2 楼 sonic_yj 2007-04-22  
Audion 写道
原来的文章就曾经提到过,在drools中,域约束好像只能适用于对象的简单类型域,复杂对象类型的是不能用域限定方式来做的。如:


认识基本相同,这么复杂的对象不管在用什么都需要小心
1 楼 Audion 2007-04-22  
怎么没有人回复我啊?大家都没有遇到过这种情况的么?!!

相关推荐

    规则引擎处理复杂对象论坛1

    在讨论的论坛中,开发者们探讨了如何在Drools规则引擎中处理复杂对象的问题。Drools是一款开源的Java规则引擎,它基于JBOSS社区,用于实现复杂的业务规则。 在Drools早期版本(如3.06和3.1M)中,规则定义存在一定...

    规则引擎Drools使用手册(中文)

    - **WorkingMemory创建方式变更**:在Drools 4.0中引入了StatefulSession和 StatelessSession两种不同的会话类型,以取代原来的单一WorkingMemory类型。 - **WorkingMemory操作方法变更**:为了避免关键字冲突,部分...

    Drools规则引擎样例系统

    在这个名为"Drools规则引擎样例系统"的项目中,我们可以深入学习如何利用Drools进行规则的定义、存储、管理和执行,以及如何与Java代码紧密结合,构建出高效运行的业务系统。 首先,让我们了解一下Drools的核心概念...

    drools规则引擎4.0中文使用手册

    - **WorkingMemory创建**:在Drools 3.0.x中,通过`rulebase.newWorkingMemory()`创建WorkingMemory。而在Drools 4.0.x中,则需要使用`rulebase.newStatefulSession()`创建有状态的Rule Session。 - **...

    Drools4.0官方使用手册中文

    - **支持条件元素的嵌套**:这意味着可以在规则中实现更为复杂的逻辑结构,比如一阶逻辑的完整支持。 - **支持使用 `&&` 和 `||` 连接多个约束条件**:这使得条件语句的构建变得更加直观。 - **语法解析器的增强**:...

    Drools4.0 官方使用手册中文.doc

    Drools 4.0 是一个重要的更新,相较于之前的 Drools 3.0.x 版本,它在多个方面进行了重大改进,包括语言表达式、引擎性能、工具实用性及业务规则管理系统(BRMS)。以下将详细阐述这些更新内容: 1. **语言表达式...

    drools 6.2 examples

    压缩包中的"examples"可能包含多个子目录,每个子目录对应一个具体的示例,例如: 1. **Hello World**:这是最基础的示例,展示了如何创建和加载规则,以及如何使用Drools执行规则。通过这个例子,你可以了解到...

    kie-commons-validation-6.0.0.Alpha9.zip

    4. **递归**:在树结构中,通常需要使用递归算法来处理嵌套分支,即一个函数调用自身来解决复杂问题。 5. **Git**:分布式版本控制系统,用于跟踪和协调团队对代码的更改。 为了进一步探索这些项目,你可以解压文件...

Global site tag (gtag.js) - Google Analytics