首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同用户的Drools规则

不同用户的Drools规则
EN

Stack Overflow用户
提问于 2016-03-12 21:42:57
回答 1查看 288关注 0票数 1

我最近开始用Drools编程,我有一个智能可穿戴设备,可以将计步器和心率数据发送到我的笔记本电脑。然后,我使用drools规则语言处理这些数据。但是假设我有多个智能可穿戴设备,每个都有一个唯一的MAC地址。我使用时间窗口,我的问题是如何更改我的规则文件,以便规则只对具有相同宏地址的事件触发,并在此MAC地址基础上采取批准的操作。我的当前规则文件如下:

代码语言:javascript
复制
import hellodrools.Steps
import hellodrools.HeartRate
import hellodrools.AppInfo

declare AppInfo
    @role(event)
end

declare Steps
    @role(event)
end

declare HeartRate
    @role(event)    
end


rule "ACC STEPS RULE"
when
    accumulate( Steps( $s : steps )
                over window:time( 1h ) from entry-point "entrySteps"; 
        $fst: min( $s ), $lst: max( $s );
        $lst - $fst < 50 )
then
    System.out.println("STEPS RULE: get moving!");
    System.out.println($lst + "   " + $fst);

end

rule "HEARTRATE RULE 1"
when
    $heartrate : HeartRate(heartRate >= 150) from entry-point "entryHeartRate"
then
    System.out.println("Heartrate is to high!");
end

rule "HEARTRATE RULE 2"
when
    $heartrate : HeartRate(heartRate <= 50 && heartRate >= 35) from entry-            point "entryHeartRate"
then
    System.out.println("Heartrate is to low!");
end

rule "HEARTRATE RULE 3"
when
    $heartrate : HeartRate(heartRate < 35 && heartRate >= 25) from entry-point "entryHeartRate"
then
    System.out.println("Heartrate is critical low!");
end

rule "HEARTRATE RULE 4"
when
    $max : Double() from accumulate(
        HeartRate( $heartrates : heartRate ) over window:time( 10s ) from entry-point "entryHeartRate",
        max( $heartrates ) )&&
    $min : Double() from accumulate(
        HeartRate( $heartrates : heartRate ) over window:time( 10s ) from entry-point "entryHeartRate",
        min( $heartrates ) )&&
    eval( ($max - $min) >= 50 )
then
    System.out.println("Heartrate to much difference in to little time!");
end

我的HeartRate事件有以下字段:

代码语言:javascript
复制
int heartRate;
Date timeStamp;
String macAddress;

我的Steps事件有以下字段:

代码语言:javascript
复制
double steps;
Date timeStamp;
String macAddress;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-12 22:14:02

这很简单:您需要定义一个事实,用String macAddress调用它,用规则应该处理的MAC地址创建它,然后

代码语言:javascript
复制
rule "ACC STEPS RULE"
when
  Walker( $mac: macAddress )
  accumulate( Steps( $s : steps, macAddress == $mac )
              over window:time( 1h ) from entry-point "entrySteps"; 
      $fst: min( $s ), $lst: max( $s );
      $lst - $fst < 50 )
  then ... end

其他规则也是如此。-你可以通过定义一条基本规则来简化这一点

代码语言:javascript
复制
rule "MAC"
when
  Walker( $mac: macAddress )
then end

并将其他规则编写为扩展:

代码语言:javascript
复制
rule "ACC STEPS RULE" extends "MAC" ...

因此,您不需要对每个规则重复Walker模式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35963662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档