用于实时分析(python规则引擎)

durable-rules的Python项目详细描述


持久规则是一个多时隙的微观框架,用于实时、一致和可伸缩的事件协调。使用持久性规则,您可以通过组合来自多个源的数据来推断更复杂的情况,从而跟踪和分析有关发生的事情(事件)的信息。

完整的前向链接实现(也称为rete)用于实时评估事实和事件。简单的元语言抽象允许您定义简单和复杂的规则集以及控制流结构,如流程图、状态图、嵌套状态图和时间驱动流。

持久规则核心引擎在c语言中实现,实现了快速的规则计算和多语言支持。

在Durable_Rules v2中,less is more:rete树在C中完全计算。因此,该框架的速度要快5到10倍(取决于场景),并且不需要redis。用于发布事件、断言和收回事实的编程模型是同步的,并且没有规定任何web框架。

入门

持久性规则很简单:要定义规则,只需描述要匹配的事件或事实模式(先行)和要采取的操作(后续)。

要安装框架,请执行以下操作:pip install durable_rules

from durable.lang import *

with ruleset('test'):
    # antecedent
    @when_all(m.subject == 'World')
    def say_hello(c):
        # consequent
        print ('Hello {0}'.format(c.m.subject))

post('test', { 'subject': 'World' })

正向推理

持久规则超能力是对规则的正向链式评价。换句话说,对一组事实或观察到的事件重复应用逻辑模式ponens(https://en.wikipedia.org/wiki/Modus_ponens)以得出结论。下面的示例显示了应用于小型知识库(事实集)的一组规则。

from durable.lang import *

with ruleset('animal'):
    @when_all(c.first << (m.predicate == 'eats') & (m.object == 'flies'),
              (m.predicate == 'lives') & (m.object == 'water') & (m.subject == c.first.subject))
    def frog(c):
        c.assert_fact({ 'subject': c.first.subject, 'predicate': 'is', 'object': 'frog' })

    @when_all(c.first << (m.predicate == 'eats') & (m.object == 'flies'),
              (m.predicate == 'lives') & (m.object == 'land') & (m.subject == c.first.subject))
    def chameleon(c):
        c.assert_fact({ 'subject': c.first.subject, 'predicate': 'is', 'object': 'chameleon' })

    @when_all((m.predicate == 'eats') & (m.object == 'worms'))
    def bird(c):
        c.assert_fact({ 'subject': c.m.subject, 'predicate': 'is', 'object': 'bird' })

    @when_all((m.predicate == 'is') & (m.object == 'frog'))
    def green(c):
        c.assert_fact({ 'subject': c.m.subject, 'predicate': 'is', 'object': 'green' })

    @when_all((m.predicate == 'is') & (m.object == 'chameleon'))
    def grey(c):
        c.assert_fact({ 'subject': c.m.subject, 'predicate': 'is', 'object': 'grey' })

    @when_all((m.predicate == 'is') & (m.object == 'bird'))
    def black(c):
        c.assert_fact({ 'subject': c.m.subject, 'predicate': 'is', 'object': 'black' })

    @when_all(+m.subject)
    def output(c):
        print('Fact: {0} {1} {2}'.format(c.m.subject, c.m.predicate, c.m.object))


assert_fact('animal', { 'subject': 'Kermit', 'predicate': 'eats', 'object': 'flies' })
assert_fact('animal', { 'subject': 'Kermit', 'predicate': 'lives', 'object': 'water' })
assert_fact('animal', { 'subject': 'Greedy', 'predicate': 'eats', 'object': 'flies' })
assert_fact('animal', { 'subject': 'Greedy', 'predicate': 'lives', 'object': 'land' })
assert_fact('animal', { 'subject': 'Tweety', 'predicate': 'eats', 'object': 'worms' })

模式匹配

持久性规则提供字符串模式匹配。表达式被编译为一个dfa,保证每个字符的线性执行时间按一位数纳秒的顺序排列(注意:不支持回溯表达式)。

from durable.lang import *

with ruleset('test'):
    @when_all(m.subject.matches('3[47][0-9]{13}'))
    def amex(c):
        print ('Amex detected {0}'.format(c.m.subject))

    @when_all(m.subject.matches('4[0-9]{12}([0-9]{3})?'))
    def visa(c):
        print ('Visa detected {0}'.format(c.m.subject))

    @when_all(m.subject.matches('(5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|2720)[0-9]{12}'))
    def mastercard(c):
        print ('Mastercard detected {0}'.format(c.m.subject))

assert_fact('test', { 'subject': '375678956789765' })
assert_fact('test', { 'subject': '4345634566789888' })
assert_fact('test', { 'subject': '2228345634567898' })

业务规则和礼仪小姐

持久性规则也可以用来解决传统的生产业务规则问题。这个例子是一个行业基准。礼仪小姐决定举办一个聚会。她想让客人就座,这样相邻的人都是异性,并且至少有一个共同的爱好。

注意如何使用状态图来定义基准流结构,以提高代码的可读性,而不牺牲性能,也不改变基准所需的组合。对于128位客人,438个事实,执行时间为600毫秒。

https://github.com/jruizgit/rules/blob/master/testpy/manners.py

IMAC、4GHz i7、32GB 1600MHz DDR3、1.12 TB Fusion驱动器

图像识别和waltzdb

waltzdb是一个用于图像识别的约束传播问题:给定二维空间中的一组直线,系统需要解译图像的三维深度。算法的第一部分包括识别四种类型的连接,然后根据huffman-clowes符号标记连接。相邻的连接对彼此的边标记有约束。因此,在为初始连接选择标记之后,算法的第二部分迭代图,通过移除不一致的标记来传播标记约束。

在这种情况下,基准流结构也是使用状态图来定义的,以提高代码的可读性。基准要求没有改变。对于4个区域654 ms的情况,执行时间。

https://github.com/jruizgit/rules/blob/master/testrb/waltzdb.rb

IMAC、4GHz i7、32GB 1600MHz DDR3、1.12 TB Fusion驱动器

参考手册:

https://github.com/jruizgit/rules/blob/master/docs/py/reference.md

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java将json反序列化为列表<Object>   Spring框架中的java回滚机制   java如何使反射在JDK 16及更高版本上工作?   java终结器如何导致可移植性问题?   java Hibernate使用ON子句或alternative左连接获取   java aws codebuild maven项目失败“保存的引用不明确”   并发Java多线程读取单个大文件   java如果输入仅由1和0组成,请将其从二进制转换为十进制   java在RealmRecyServiceAdapter上调用updateData实际上并没有更新数据   javajsf:h commandlink操作是打开同一页面的新弹出窗口,而不是调用bean方法   java我们可以为其中一个变量同时添加@Column和@OneToOne注释吗?   java JBoss AS 7自定义登录模块从未调用   如何检查Java中是否存在数组中的元素   java Spring重试:未调用带@Recover注释的方法   如何解析带有Java错误HTTP格式问题的php消息   java如何在weblogic中部署可选的包共享库   java将配置单元中的数据集保存为avro格式的合并列   用Guice注入java泛型   java单选按钮组和额外选项   javajackson:如何读取字符串作为列表?