Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为不同的用户定义规则_Java_Drools_Rule_Drools Fusion - Fatal编程技术网

Java 为不同的用户定义规则

Java 为不同的用户定义规则,java,drools,rule,drools-fusion,Java,Drools,Rule,Drools Fusion,我最近开始用Drools Fusion编程,我有一个智能穿戴设备,可以将计步器和心率数据发送到我的笔记本电脑。然后,我使用drools规则语言处理这些数据。但假设我有多个智能穿戴设备,每个都有一个唯一的MAC地址。我使用时间窗口,我的问题是如何更改规则文件,使规则只针对具有相同macaddress和 基于此MAC地址采取适当的操作。 我的当前规则文件如下所示: import hellodrools.Steps import hellodrools.HeartRate import hellodr

我最近开始用Drools Fusion编程,我有一个智能穿戴设备,可以将计步器和心率数据发送到我的笔记本电脑。然后,我使用drools规则语言处理这些数据。但假设我有多个智能穿戴设备,每个都有一个唯一的MAC地址。我使用时间窗口,我的问题是如何更改规则文件,使规则只针对具有相同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;

这很简单:您需要定义一个事实,用
字符串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 "ACC STEPS RULE" extends "MAC" ...

因此,您无需为每个规则重复
Walker
模式。

谢谢您的回答。就像我说的,我刚开始流口水,我不完全理解。我创建了一个带有字段macAddress的新类Walker。然后在我的规则文件中将其声明为事实:
declare Walker@role(fact)end
并更新了我的规则。然后我做了如下操作:
Walker=newwalker(macAddress);入口点台阶。插入(助行器)entryPointSteps
插入,则必须在规则中使用“from entrySteps”。是吗?我还有最后一个问题。现在,如果我插入一个具有特定macAddress的新stepevent,则将为系统中的所有macAddress触发该规则。但我希望它只为插入事件的macAddress激发。我该如何改变这一点呢?然后,缺少了将某个Walker的macAddress与Steps事件中的macAddress进行比较的约束(如Steps模式中的约束)。也许您可以进一步阐述您的情况。更多的盲目猜测不太可能有帮助问另一个问题,说明你的规则和你插入的事实。
rule "ACC STEPS RULE" extends "MAC" ...