5分钟掌握Archi属性值过滤:从混乱模型到精准筛选的进阶指南
【免费下载链接】archi Archi: ArchiMate Modelling Tool 项目地址: https://gitcode.com/gh_mirrors/arc/archi
你是否还在面对数百个元素的ArchiMate模型时,为查找特定属性值的组件而焦头烂额?作为企业架构师,当你需要从复杂模型中快速定位"所有者=业务部门A"的所有应用组件,或筛选"成本中心=CC-2025"的IT服务时,手动排查不仅效率低下,更可能遗漏关键元素。本文将系统讲解Archi(ArchiMate Modelling Tool)中基于属性值的过滤功能实现原理与实战技巧,帮助你5分钟内掌握高效筛选模型元素的核心方法,显著提升架构分析效率。
读完本文你将获得:
- 理解Archi属性过滤的底层实现机制
- 掌握3种属性值筛选的操作方法(基础搜索/高级过滤/批量导出)
- 学会构建复杂条件的组合过滤规则
- 解决大型模型筛选性能优化的实践方案
功能原理:Archi属性过滤的技术实现
Archi的属性值过滤功能主要通过SearchFilter类(com.archimatetool.editor/src/com/archimatetool/editor/views/tree/search/SearchFilter.java)实现核心逻辑,该类继承自Eclipse的ViewerFilter,通过正则匹配与多条件组合完成元素筛选。其工作原理可分为三个阶段:
核心实现代码解析
Archi的属性过滤核心代码位于SearchFilter类的matchesFilter方法,该方法通过组合条件判断元素是否满足过滤规则:
public boolean matchesFilter(Object element) {
boolean show = true;
// 概念类型过滤
if(isFilteringConcepts() || isFilteringSpecializations() || isFilteringViews()) {
show = (isFilteringConcepts() && shouldShowConcept(element))
|| (isFilteringSpecializations() && shouldShowSpecialization(element))
|| (isFilteringViews() && element instanceof IDiagramModel);
}
// 属性值过滤核心逻辑
if(isFilteringName() || isFilteringDocumentation() || isFilteringPropertyKeys() || isFilteringPropertyValues()) {
show &= (isFilteringName() && shouldShowObjectWithName(element))
|| (isFilteringDocumentation() && shouldShowObjectWithDocumentation(element))
|| ((isFilteringPropertyKeys() || isFilteringPropertyValues()) && shouldShowObjectWithProperty(element));
}
return show;
}
当启用属性值过滤时,shouldShowObjectWithProperty方法会遍历元素的所有属性,通过matchesString方法进行值匹配:
private boolean shouldShowObjectWithProperty(Object element) {
if(element instanceof IProperties properties) {
for(IProperty property : properties.getProperties()) {
// 按属性键过滤
if(isFilteringPropertyKeys()) {
if(propertyKeyFilter.contains(property.getKey())) {
// 同时按属性值过滤
return isFilteringPropertyValues() ? matchesString(property.getValue()) : true;
}
}
// 直接按属性值过滤
else if(matchesString(property.getValue())) {
return true;
}
}
}
return false;
}
匹配逻辑支持两种模式:简单文本包含和正则表达式匹配,由matchesString方法实现:
private boolean matchesString(String str) {
if(str == null || str.length() == 0) return false;
if(getUseRegex()) {
return matchesRegexString(str); // 正则匹配
}
if(getMatchCase()) {
return str.contains(fSearchText); // 大小写敏感匹配
}
return str.toLowerCase().contains(fSearchText.toLowerCase()); // 大小写不敏感匹配
}
操作指南:三种筛选方法的实战对比
Archi提供了三种基于属性值的过滤方式,适用于不同场景需求。以下通过"筛选所有成本中心编码为'CC-2025'的应用组件"案例,对比三种方法的操作流程与适用场景。
1. 快速搜索过滤(基础版)
适用场景:临时查询、简单条件筛选
操作路径:模型树视图 → 搜索框 → 输入属性值 → 启用属性过滤
步骤分解:
- 在模型树视图右上角激活搜索框(快捷键
Ctrl+F) - 输入属性值关键词
CC-2025 - 点击搜索框下拉箭头,勾选"属性值"选项
- 系统自动隐藏不匹配元素,匹配元素以粗体显示
技术实现:通过TreeModelViewer类(com.archimatetool.editor/src/com/archimatetool/editor/views/tree/TreeModelViewer.java)添加搜索过滤器:
public void addFilter(ViewerFilter filter) {
if(filter instanceof SearchFilter searchFilter) {
this.searchFilter = searchFilter;
}
super.addFilter(filter);
}
优势:操作简单,即时生效
局限:无法指定属性键,可能匹配无关属性
2. 高级属性过滤(专业版)
适用场景:精确筛选、多条件组合
操作路径:窗口 → 显示视图 → 其他 → Archi → 属性过滤
高级过滤面板提供多维度条件组合:
- 属性键过滤:指定特定属性名称(如"成本中心")
- 属性值匹配:支持文本/正则/大小写敏感选项
- 概念类型过滤:限定元素类型(如仅筛选应用组件)
- 特殊化过滤:按Profile标记筛选
操作示例:筛选"所有者=业务部门A"且"状态=活跃"的应用组件
- 在属性过滤视图点击"添加属性键",选择"所有者"
- 输入属性值"业务部门A"
- 点击"+"添加第二个条件,选择"状态"属性,值"活跃"
- 在概念类型过滤中勾选"应用组件"
- 点击"应用过滤",模型树仅显示匹配元素
3. 命令行批量过滤(专家版)
适用场景:自动化脚本、定期报告生成
操作方法:使用Archi的命令行接口配合CSV导出功能实现批量筛选:
./archi -consoleLog -nosplash -application com.archimatetool.commandline.app \
-export model.archimate -format csv \
-filter "property:成本中心=CC-2025;type=ApplicationComponent" \
-output filtered_elements.csv
实现原理:命令行过滤通过com.archimatetool.commandline插件实现,底层复用SearchFilter类的过滤逻辑,将匹配结果导出为CSV格式。
实战技巧:从基础到高级的筛选应用
基础应用:简单属性值匹配
假设需要筛选所有"环境=生产"的IT服务,操作步骤如下:
- 在模型树视图激活搜索框(
Ctrl+F) - 输入"生产"
- 点击搜索选项按钮(⚙️),仅勾选"属性值"
- 取消勾选"名称"和"文档"选项
- 匹配元素会以粗体显示,不匹配元素自动隐藏
关键设置:确保在搜索选项中仅启用"属性值"过滤,避免名称中包含"生产"的元素被误匹配。
进阶应用:多条件组合过滤
当需要筛选"成本中心=CC-2025"且"所有者=IT部门"的所有元素时,可通过以下步骤实现:
// 伪代码展示多条件过滤实现
SearchFilter filter = new SearchFilter();
filter.setSearchText("CC-2025");
filter.addPropertyKeyFilter("成本中心");
filter.setFilterOnPropertyValues(true);
// 添加第二个条件
filter.addPropertyKeyFilter("所有者");
filter.setSearchText("IT部门");
操作界面:在高级过滤视图中,点击"添加条件"按钮可创建多条件逻辑与(AND)关系,按住Ctrl键点击可创建逻辑或(OR)关系。
高级应用:正则表达式匹配
处理复杂模式的属性值时,正则表达式过滤能发挥强大作用:
| 应用场景 | 正则表达式 | 匹配示例 |
|---|---|---|
| 邮箱格式验证 | ^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$ | archi@example.com |
| 版本号匹配 | ^v\d+\.\d+\.\d+$ | v1.2.3 |
| 成本中心编码 | ^CC-\d{4}$ | CC-2025 |
操作示例:筛选所有以"SA-"开头的系统架构组件:
- 在搜索框输入
^SA- - 勾选"使用正则表达式"选项
- 启用"属性值"过滤
- 系统自动匹配所有属性值以"SA-"开头的元素
性能优化:大型模型的筛选效率提升
当模型元素超过1000个时,属性过滤可能出现卡顿。通过以下优化策略可显著提升筛选性能:
1. 索引优化
Archi在TreeModelViewer中采用延迟加载机制(setDisplayIncrementally),通过设置合理的节点加载数量平衡性能与响应速度:
// 设置增量显示节点数量
int limit = ArchiPlugin.getInstance().getPreferenceStore().getInt(IPreferenceConstants.TREE_DISPLAY_NODE_INCREMENT);
setDisplayIncrementally(limit);
建议配置:在首选项 → Archi → 模型树中,将"节点增量显示数量"设置为50-100(默认30)。
2. 过滤条件优化
- 优先使用属性键过滤:先按属性键筛选可大幅减少后续值匹配的元素数量
- 限制概念类型:明确元素类型可减少70%以上的遍历元素
- 避免复杂正则:尽量使用简单表达式,复杂正则会增加5-10倍处理时间
3. 批量操作替代实时过滤
对超大型模型(>5000元素),建议使用批量导出后再分析:
- 导出完整模型为CSV(文件 → 导出 → CSV)
- 在Excel中使用高级筛选功能处理
- 通过Archi的CSV导入功能重建筛选后的子模型
常见问题与解决方案
Q1:为什么设置了属性过滤但没有结果?
可能原因与解决:
- 属性键名称不匹配:Archi区分大小写,"成本中心"与"CostCenter"视为不同属性
- 元素类型过滤冲突:检查是否同时启用了概念类型过滤,导致范围过窄
- 正则表达式错误:复杂正则可能导致匹配失败,可先使用简单文本测试
Q2:如何保存常用的过滤条件?
Archi目前暂不支持保存过滤条件,但可通过以下变通方法实现:
- 创建包含过滤条件的模型模板
- 使用命令行脚本固化常用过滤规则
- 导出/导入过滤视图配置文件(位于
.metadata/.plugins/com.archimatetool.editor/filters/)
Q3:大型模型过滤时界面卡顿怎么办?
性能优化方案:
- 临时关闭"实时更新"选项,手动触发过滤
- 增加JVM内存分配(编辑
Archi.ini,设置-Xmx1024m) - 使用64位版本Archi并安装Java 11+
- 拆分大型模型为多个子模型,独立过滤后合并结果
总结与展望
Archi的属性值过滤功能通过SearchFilter类的灵活设计,为架构师提供了从简单到复杂的全方位筛选能力。无论是日常的快速查询还是复杂的多条件筛选,掌握这些技巧都能显著提升模型分析效率。
随着Archi 5.2版本的发布,属性过滤功能将进一步增强:
- 支持保存/加载过滤配置文件
- 增加条件组(Group)功能,实现更复杂的逻辑组合
- 引入属性值范围过滤(如数值区间、日期范围)
作为企业架构师,熟练运用属性过滤功能不仅能提高日常工作效率,更能在架构评审、合规检查、资产盘点等场景中发挥关键作用。建议结合实际工作需求,构建个人的过滤条件库,让Archi真正成为架构分析的得力助手。
最佳实践:定期整理模型中的标准属性(如所有者、成本中心、状态),建立统一的属性命名规范,这是实现高效过滤的基础。混乱的属性命名会使任何过滤工具都难以发挥作用。
【免费下载链接】archi Archi: ArchiMate Modelling Tool 项目地址: https://gitcode.com/gh_mirrors/arc/archi
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



