[rules-users] unsolved myth regarding transitive closure using insertlogical...

Simon Chen simonchennj at gmail.com
Sun Feb 20 22:39:07 EST 2011


On Sun, Feb 20, 2011 at 10:11 PM, Mark Proctor <mproctor at codehaus.org> wrote:
> On 21/02/2011 03:03, Simon Chen wrote:
>> On Sun, Feb 20, 2011 at 8:20 PM, Ansgar Konermann
>> <ansgar.konermann at googlemail.com>  wrote:
>>> On 19.02.2011 16:01, Simon Chen wrote:
>>>> The example you gave seems to be the one-hop case. For the two-hop
>>>> case, we need something like this
>>>>
>>>> when
>>>>      edge(a, b), reach(b, c), not exists reach(a, c)
>>>> then
>>>>      insertLogical( reach(a,c) )
>>>>
>>>> So, where do you put your logical around? It should include both
>>>> edge(a,b) and reach(b,c), right?
>>>>
>>>> Another thought, can we have something like
>>>> testExistsAndInsertLogical() to replace insertLogical()? But this may
>>>> be buggy, as the conditions are all met, so the rule actually fired...
>>>>
>>> Hi,
>>>
>>> from my experience, insertLogical does exactly what
>>> testExistsAndInsertLogical would suggest. If the same object is already
>>> in the working memory, it keeps this object and does not insert another
>>> instance. This behaviour is not stated explicitly in the documentation,
>>> but I did a learning test a few weeks ago and IIRC it clearly showed
>>> this behaviour (at least for 5.0.1). -- I consider this behaviour a
>>> feature and would like it to be kept this way.
>> I am using Drools 5.1.1, and I don't think insertLogical prevents
>> duplicates automatically. This also boils down to the question of how
>> Drools decides whether two objects are indeed the same. For strings
>> and integers, it is straightforward, but not much so for complex
>> objects. Is there a way to pass in a comparison function?
> InsertLogical operates on equality mode, that is determined by the
> pojo's equals() method implementation. If an object already exists that
> is equal, it will use that and the justification counter for that
> existing object is increased.

But, insertLogical() is in the "then" part of the rule, which means at
that point the rule is already fired... Without something like "not
exists", the rules just keep firing...

I've been trying to read the source code of drools-core, but haven't
got to that level of details yet. My question is if a duplicated
object is logically inserted, would that trigger another round of rule
firing? If it's just justification counter update, it shouldn't be
counted as object modification, right?

Thanks.
-Simon

>
> Mark
>>> With this, all which is necessary to implement transitive closure is to
>>> remove the contradicting part of the precondition to avoid oscillation.
>>> If it turns out that insertLogical does not perform a "does fact already
>>> exist" check and thus might potentially insert duplicates, put exists( )
>>> around the two preconditions and also use "exists( reach(x,y) )" to
>>> check whether y is reachable from x.
>> I don't quite follow. Can you elaborate with an actual rule?
>>
>> Thanks!
>> -Simon
>>
>>> Kind regards
>>>
>>> Ansgar
>>> _______________________________________________
>>> rules-users mailing list
>>> rules-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>




More information about the rules-users mailing list