You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何读取解析Simulink模型信息并导入Neo4j图数据库?

Simulink模型解析与Neo4j可视化实现方案

一、解析Simulink模型信息

利用MATLAB内置API可直接读取Simulink模型中的模块、连接关系等核心信息,具体步骤如下:

1. 批量处理.slx模型文件

编写MATLAB脚本遍历目标文件夹下的所有模型,提取模块与连接数据并导出为JSON格式:

% 设置模型文件夹路径
modelDir = '你的Simulink模型所在文件夹路径';
slxFiles = dir(fullfile(modelDir, '*.slx'));

% 遍历每个模型文件
for i = 1:length(slxFiles)
    modelPath = fullfile(modelDir, slxFiles(i).name);
    open_system(modelPath); % 打开模型
    modelName = slxFiles(i).name(1:end-4); % 去除.slx后缀
    
    % 初始化数据存储结构
    modelData.blocks = [];
    modelData.connections = [];
    
    % 获取模型中所有模块(含子系统内模块)
    blocks = find_system(modelPath, 'Type', 'Block');
    
    % 遍历每个模块,提取信息及连接关系
    for j = 1:length(blocks)
        blockPath = blocks(j);
        % 获取模块核心属性:名称、类型、完整路径
        blockProps = get_param(blockPath, {'Name', 'BlockType', 'Path'});
        blockInfo = struct( ...
            'model', modelName, ...
            'name', blockProps{1}, ...
            'type', blockProps{2}, ...
            'path', blockProps{3} ...
        );
        modelData.blocks = [modelData.blocks; blockInfo];
        
        % 获取该模块的端口连接信息
        portConn = get_param(blockPath, 'PortConnectivity');
        for k = 1:length(portConn)
            conn = portConn(k);
            % 过滤无效连接(无来源或目标的情况)
            if ~isempty(conn.Source) && ~isempty(conn.Destination)
                connInfo = struct( ...
                    'model', modelName, ...
                    'source_block', conn.Source.BlockPath, ...
                    'source_port', conn.Source.Port, ...
                    'dest_block', conn.Destination.BlockPath, ...
                    'dest_port', conn.Destination.Port ...
                );
                modelData.connections = [modelData.connections; connInfo];
            end
        end
    end
    
    % 关闭当前模型,释放资源
    close_system(modelPath);
    
    % 将数据导出为JSON格式(方便后续导入Neo4j)
    jsonStr = jsonencode(modelData);
    fid = fopen(fullfile(modelDir, [modelName '_data.json']), 'w');
    fprintf(fid, '%s', jsonStr);
    fclose(fid);
end

2. 数据说明

  • 模块数据:包含模型名称、模块名称、模块类型、模块完整路径(作为唯一标识)
  • 连接数据:包含模型名称、源模块路径、源端口号、目标模块路径、目标端口号

二、将解析数据导入Neo4j

提供两种导入方式,分别适配中小规模与大规模数据场景:

方式1:使用py2neo库导入(灵活易用)

1. 安装依赖

pip install py2neo

2. 编写Python导入脚本

from py2neo import Graph, Node, Relationship
import json

# 连接Neo4j数据库(替换为你的数据库地址、用户名、密码)
graph = Graph("bolt://localhost:7687", auth=("neo4j", "你的数据库密码"))

# 读取Simulink导出的JSON数据文件
dataPath = '导出的JSON文件路径'
with open(dataPath, 'r') as f:
    modelData = json.load(f)

# 开启事务,批量导入提升效率
tx = graph.begin()

# 导入模块节点:以模块完整路径为唯一键,避免重复导入
for block in modelData['blocks']:
    blockNode = Node(
        'SimulinkBlock',
        model=block['model'],
        name=block['name'],
        type=block['type'],
        path=block['path']
    )
    tx.merge(blockNode, 'SimulinkBlock', 'path')

# 导入连接关系:关联源模块与目标模块
for conn in modelData['connections']:
    # 根据模块路径查找对应节点
    sourceNode = graph.nodes.match('SimulinkBlock', path=conn['source_block']).first()
    destNode = graph.nodes.match('SimulinkBlock', path=conn['dest_block']).first()
    
    if sourceNode and destNode:
        connRel = Relationship(
            sourceNode,
            'CONNECTS_TO',
            destNode,
            source_port=conn['source_port'],
            dest_port=conn['dest_port'],
            model=conn['model']
        )
        tx.create(connRel)

# 提交事务
tx.commit()

方式2:使用neo4j-admin import工具(大数据量场景)

1. 转换数据为CSV格式

  • 节点文件(nodes.csv):
:ID,model:string,name:string,type:string,path:string
block_1,model1,Integrator,Integrator,model1/Integrator
block_2,model1,Scope,Scope,model1/Scope
...

说明::ID为节点唯一标识,可使用模块路径的哈希值或自定义ID。

  • 关系文件(relationships.csv):
:START_ID,:END_ID,:TYPE,source_port:int,dest_port:int,model:string
block_1,block_2,CONNECTS_TO,1,1,model1
...

说明::START_ID和:END_ID对应节点文件中的:ID。

2. 执行导入命令

neo4j-admin import --nodes=nodes.csv --relationships=relationships.csv --database=simulink.db --force

参数说明:--force用于覆盖已存在的数据库(谨慎使用)。

三、Neo4j可视化

导入完成后,打开Neo4j Browser(默认地址http://localhost:7474),执行Cypher查询即可查看可视化效果:

MATCH (b:SimulinkBlock)-[r:CONNECTS_TO]->(c:SimulinkBlock) RETURN b, r, c LIMIT 100

可通过添加筛选条件(如WHERE b.model = 'model1')聚焦特定模型的结构。

内容的提问来源于stack exchange,提问作者Mohammad Ibrahim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 23:36:17