作为贝叶斯工作的一部分,我对Kie进行了很多重构,使其具有清晰的扩展点。 我想确保可以完成贝叶斯系统的所有工作部件,而无需在现有内核中添加任何代码。
因此,现在每种知识类型都可以拥有自己的包,汇编器,编织器和运行时。 知识不再直接添加到KiePackage中,而是添加到该域的封装知识包中,然后再添加到KiePackage中。 解析和组装知识定义时使用汇编程序阶段。 编织阶段是将这些知识定义编织到现有的KieBase中。 最后,运行时封装并为知识提供运行时。
drools-beliefs包含贝叶斯积分和了解其工作原理的良好起点: https : //github.com/droolsjbpm/drools/tree/beliefs/drools-beliefs/
为此,您需要一个META-INF / kie.conf文件,并将其发现并使用: https : //github.com/droolsjbpm/drools/blob/beliefs/drools-beliefs/src/main/resources/ META-INF / kie.conf
该文件使用MVEL语法,并指定一项或多项服务:
[
'assemblers' : [ new org.drools.beliefs.bayes.assembler.BayesAssemblerService() ],
'weavers' : [ new org.drools.beliefs.bayes.weaver.BayesWeaverService() ],
'runtimes' : [ new org.drools.beliefs.bayes.runtime.BayesRuntimeService() ]
]
Github链接到软件包和服务实现:
这是一个快速的单元测试,显示了端到端的工作,请注意如何查找和访问运行时。 它在测试中使用了旧的api,但也可以与声明性的kmodule.xml一起使用。 仍然是硬编码的唯一位是ResourceType.Bayes。 由于ResourceTypes是一个枚举。 我们可能会将其重构为标准类,以便对其进行硬编码。
查找运行时的代码:
StatefulKnowledgeSessionImpl ksession = (StatefulKnowledgeSessionImpl) kbase.newStatefulKnowledgeSession();
BayesRuntime bayesRuntime = ksession.getKieRuntime(BayesRuntime.class);
单元测试:
KnowledgeBuilder kbuilder = new KnowledgeBuilderImpl();
kbuilder.add( ResourceFactory.newClassPathResource("Garden.xmlbif", AssemblerTest.class), ResourceType.BAYES );
KnowledgeBase kbase = getKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
StatefulKnowledgeSessionImpl ksession = (StatefulKnowledgeSessionImpl) kbase.newStatefulKnowledgeSession();
BayesRuntime bayesRuntime = ksession.getKieRuntime(BayesRuntime.class);
BayesInstance instance = bayesRuntime.getInstance( Garden.class );
assertNotNull( instance );
jBPM已经从内核和编译器中重构出来,尽管它为此使用了自己的接口。 我们计划将现有的jBPM方式移植到此方法,实际上所有Drools的东西最终也将以这种方式完成。 这将创建一个干净的KIE核心,并将规则,过程,贝叶斯或任何其他用户知识类型的编译器全部添加为插件。
社区人士也已经在开发一种新的类型声明系统,该系统将利用这些扩展。 这是这种新型系统的示例: https : //github.com/sotty/metaprocessor/blob/master/deklare/src/test/resources/test1.ktd