PM4PY - 分析建议怎样的BPMN可以转换成Process Tree

背景

读取手动绘制的BPMN图,欲将其转换成Process Tree,必定经过先将其转换成WF-net。
然而不规范或者逻辑有分歧的BPMN无法转换成唯一的WF-net,也就无法转换成Process Tree。
Process Tree:流程树,简称PT;
WF-net:工作流网,workflow-net,简称WF-net(是Petri net的一类子网);

遇到的问题(一)

在这里插入图片描述
如上图所示,说所给的Petri net不是一个WF-net。其实正常不会引发这个报错,后来发现是BPMN图的标注用错了,事件结束的标注用成了中间事件,所以画好一个BPMN至少得细心,而且最好是符合良构编排的BPMN。可参考BPMN - 如何绘制符合良构编排的基础BPMN?

遇到的问题(二)

在这里插入图片描述
如上图所示,说WF-net解析失败。溯源,点报错行定位到报错源码位置。
在这里插入图片描述
可以看到引发该错误的是因为len(grouped_net.transitions) 不等于 1。
我们再来看看这个grouped_net到底是什么,定位到上面group_blocks_in_net函数。
在这里插入图片描述
其实就是对传过来的petri net做一个处理。返回处理后的petri net,所以这个grouped_net就是这个处理后的petri net。
那么这个grouped_net的transitions是什么,我们把这段代码拿出来打印,把相关信息打印看看。
下面读取了一个报上面转换失败错误的BPMN。

bpmn_graph = pm4py.read_bpmn('D:\\PM数据\\diagram (10).bpmn')
bpmn_graph = layouter.apply(bpmn_graph)
net, im, fm = bpmn_converter.apply(bpmn_graph)
print(net)
print()
grouped_net = tpt.group_blocks_in_net(net, parameters={
    
    })
print(grouped_net.transitions)
print(len(grouped_net.transitions))

在这里插入图片描述
前三行是没处理过的petri net的属性
倒数第二行是处理过的transitions属性
最后一行是属性个数,也就是前面不等于1的那个值
为什么要等于1呢?我将上面错误的BPMN换成可以转换成功的BPMN
在这里插入图片描述
是的,他的个数就是1。细看它确实只有一个元组,里面第一个参数是标签,第二个参数是个字符串。
仔细看他这个字符串,其实它就是一个PT的结构,原来就是通过这一长串字符串来转换成PT的。

这就是为什么他len(grouped_net.transitions) 不等于 1,就无法将没处理过的petri net转换成PT的原因。
因为这个BPMN逻辑有分歧或者其他什么原因,导致他无法合并成1个完整的流程。
这些就是分析过程。

现象:
上面错误的BPMN中,我手动分析想将它画成一个PT会出现逻辑分歧,根本画不出来。因为发现其中的循环会导致在转换成吻合的PT时无法表达出来。

可能原因:
BPMN的XOR网关出现了嵌套,逻辑混乱有分歧。

结论:
避免网关嵌套。一个网关分叉出去后,要再合并回来。

注意事项:

  1. 尽量避免网关嵌套(就拿循环来说,这段循环里,最好是被两个网关包起来,不要在这个循环里的某个节点伸出一条到循环外,即不要节外生枝),可以参照下图的循环。
    在这里插入图片描述
    它可以转换成下图的PT,reinitiate request是触发循环的事件。
    在这里插入图片描述
  2. 画的BPMN的XOR分叉和合并最好可以看成两个分支,最后两个分支合并。
    如下图所示,网关1,可以将上面一整块看成是一个事件,这样就可以看成两个事件分叉,最后用合并网关将两个事件合并。其实这样也是避免嵌套。
    在这里插入图片描述

*若对本文有疑问(例如:笔记中知识点或表达有误),欢迎指出,共同学习进步。

猜你喜欢

转载自blog.csdn.net/DreamingBetter/article/details/124302183