针对不同用户的 Drools 规则
Drools rules for different users
我最近开始使用 Drools Fusion 进行编程,并且我有一个智能可穿戴设备可以将计步器和心率数据发送到我的笔记本电脑。然后我使用 drools 规则语言处理这些数据。但是假设我有多个智能可穿戴设备,每个都有一个唯一的 MAC 地址。我使用时间 windows,我的问题是如何更改我的规则文件,以便规则仅针对具有相同 macaddress 和
根据这个 MAC 地址采取适当的行动。
我当前的规则文件如下:
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
我的心率事件有以下字段:
int heartRate;
Date timeStamp;
String macAddress;
我的步数事件有以下字段:
double steps;
Date timeStamp;
String macAddress;
这很简单:您需要定义一个事实,用 String macAddress
调用它 Walker
,用规则应该处理的 MAC 地址创建它,然后
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
与其他规则类似。 - 你可以通过定义一个基本规则
来简化这个(一点点)
rule "MAC"
when
Walker( $mac: macAddress )
then end
并将其他规则写为扩展:
rule "ACC STEPS RULE" extends "MAC" ...
因此您无需为每个规则重复 Walker
模式。
我最近开始使用 Drools Fusion 进行编程,并且我有一个智能可穿戴设备可以将计步器和心率数据发送到我的笔记本电脑。然后我使用 drools 规则语言处理这些数据。但是假设我有多个智能可穿戴设备,每个都有一个唯一的 MAC 地址。我使用时间 windows,我的问题是如何更改我的规则文件,以便规则仅针对具有相同 macaddress 和 根据这个 MAC 地址采取适当的行动。 我当前的规则文件如下:
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
我的心率事件有以下字段:
int heartRate;
Date timeStamp;
String macAddress;
我的步数事件有以下字段:
double steps;
Date timeStamp;
String macAddress;
这很简单:您需要定义一个事实,用 String macAddress
调用它 Walker
,用规则应该处理的 MAC 地址创建它,然后
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
与其他规则类似。 - 你可以通过定义一个基本规则
来简化这个(一点点)rule "MAC"
when
Walker( $mac: macAddress )
then end
并将其他规则写为扩展:
rule "ACC STEPS RULE" extends "MAC" ...
因此您无需为每个规则重复 Walker
模式。