Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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 Engine - Fatal编程技术网

Java 新手流口水链表过滤

Java 新手流口水链表过滤,java,drools,rule-engine,Java,Drools,Rule Engine,我不太会流口水,但我想用它来解决一个我需要解决的案子 基本上,我的规则需要执行以下操作: 根据到人员当前位置的给定距离筛选给定初始只读(完整)位置列表 创建一个新列表,其中包含给定距离半径内的位置 把新名单交给下一个规则 根据特定标题筛选新位置列表 创建包含位置的新列表(现在按距离和标题过滤) 所以,我想把几个规则串起来。。。首先,创建带有结果的新列表,在下一个规则中使用新列表,对其执行进一步筛选,创建带有更多筛选元素的新列表。。。等等 老实说,如前所述,我完全被卡住了,我想我能得到一些经验

我不太会流口水,但我想用它来解决一个我需要解决的案子

基本上,我的规则需要执行以下操作:

  • 根据到人员当前位置的给定距离筛选给定初始只读(完整)位置列表
  • 创建一个新列表,其中包含给定距离半径内的位置
  • 把新名单交给下一个规则
  • 根据特定标题筛选新位置列表
  • 创建包含位置的新列表(现在按距离和标题过滤)
所以,我想把几个规则串起来。。。首先,创建带有结果的新列表,在下一个规则中使用新列表,对其执行进一步筛选,创建带有更多筛选元素的新列表。。。等等

老实说,如前所述,我完全被卡住了,我想我能得到一些经验

我最初的规则是这样的:

package com.acme.rulesets
import com.acme.domain.TopLocation
import com.acme.domain.Person
import com.acme.storage.LocationContainer
import com.acme.helper.GeoHelpers
rule "Get by Distance"
salience 10
when
    $allLocations: LocationContainer()
    $person: Person()
    $loc: TopLocation() from $allLocations.getAllLocations()
then
    double distance = GeoHelpers.getInstance().getHaversineInMiles($person.getLat(), $person.getLon(), $loc.getLat(), $loc.getLon());
    System.out.println($loc.getTitle() + " -- distance in miles to person: " + distance); 
end;
到目前为止,它并没有实现我想要实现的目标。。。但也许你可以给我一些提示

因此,首先,我认为我需要在规则的LHS中调用我的静态java方法(它只计算两个给定点之间的距离),但一旦我(尝试)这样做,它就无法编译规则。然后我需要使用$dist的结果来确定当前条目是否需要放入新列表(我如何才能a.)创建新列表,b.)将当前条目放入新列表。。。然后,下一个合乎逻辑的步骤是创建一个具有更高显著性的新规则“按位置标题获取”,并使用新的筛选列表。最后,当我回到java端时,我可以从工作内存中获取所有列表,并对它们做进一步的处理

是的,我知道,我的问题可能很难回答。。。但是我找不到任何可以从中派生用例的东西


不过,请提前感谢。

我将逐一阐述这一点,而不是尝试提供一个“完整”的解决方案。你得决定用什么

首先,可能有一个很好的理由将所有位置保留在一个容器类中,该容器类是一个事实,但通常,如果容器元素本身是事实,则规则更容易编写

rule "person and location"
when
    $p: Person()
    $l: TopLocation(...)
    ...
(当然,您可以坚持使用
from
子句。)

要结合个人选择具有特定属性的位置,请使用任意布尔表达式作为约束或求值模式。如果表达式涉及一些静态Java函数,请导入它(就像在Java中一样)或将其实现为DRL函数。我将把这三者结合起来加以说明

import com.acme.helper.GeoHelpers
function double dist( Person p, TopLocation t ){
    double d =
      GeoHelpers.getInstance().getHaversineInMiles(p.getLat(), p.getLon(),
                                                   t.getLat(), t.getLon());
}

rule "p & l closer than"
when
    $p: Person()
    $l: TopLocation( dist($p,$l) < 100.0 )
    ...
现在可以很容易地任意选择标准,使用从当前搜索中派生的值。-您可以在
fireAllRules
返回后使用API检索
ResultSet
,或者编写另一条规则来处理并收回它

我建议你研究现有的文献

 rule "p & l: Hotel closer than 100"
 when
    $p: Person()
    $l: TopLocation( dist($p,$l) < 100.0,
                     title == "Hotel" )
    ...
rule "p & l, X loc closer than D"
when
    Param( $d: distance, $t: title )
    $p: Person()
    $l: TopLocation( dist($p,$l) < $d, title == $t )
    ...
rule "p & l, closer than D"
when
    $dp: DistParam( $v: distance )
    $p: Person()
    $l: ArrayList() from 
        collect( $l: TopLocation( dist($p,$l) < $v )
then
    retract( $dp );
    insert( new ResultSet( $l ) );
end

rule "p & l, filter by title"
when
    $t: TitleParam( $v: title )
    $r: ResultSet( $s: result )
    $l: ArrayList() from 
        collect( $l: TopLocation( title == $v ) from $s
then
    retract( $t );
    modify( $r ){ setResult($l) }
end