基于环保多元数据构建知识图谱 识别未纳管企业

引言:环保监管的“最后一公里”挑战

随着我国生态文明建设的深入推进,固体废物特别是危险废物的环境监管日益严格。然而,在海量的企业生产活动中,如何高效、准确地识别出那些应产危废但未纳入申报系统(即“未纳管”)的企业,一直是基层监管工作的难点和痛点。

传统的监管方式依赖人工比对多个独立系统的报表,效率低下且容易遗漏。我们面临的挑战是:

  • 数据多元异构:环评、排污许可、固废申报、用电监测等数据分散在不同部门,格式各异。
  • 信息割裂:单一数据源无法揭示企业的真实产废行为,需要跨系统关联分析。
  • 风险隐蔽:部分企业可能存在漏报、瞒报行为,仅凭表面数据难以发现。

为破解这一难题,我们探索将前沿的知识图谱(Knowledge Graph)技术应用于环保监管领域,构建一个融合多源数据的智能分析平台,旨在实现对“未纳管”企业的自动化、精准化识别。

一、项目目标

本项目的核心目标是:

  1. 数据融合:打通发改委企业清单、环评数据、排污许可证数据、企业固废申报数据等多元异构数据源。
  2. 关系挖掘:通过建立企业与危废类别之间的深层关联,构建一个全面的“产-排-报”关系网络。
  3. 智能预警:自动识别出“持有排污许可证/环评批复允许产生某类危废,但在同期固废申报系统中无对应申报记录”的企业,并生成高风险名单。
  4. 可视化洞察:提供直观的图形化界面,辅助执法人员快速理解企业间的关联模式和风险点。

二、基础数据集

项目的成功始于高质量的数据。我们整合了以下五个关键数据集:

数据集 关键字段 说明
HPD (环评) ent_name, credit_code, industry_type, hazardous_waste_code 提供企业生产工艺和潜在产废的理论依据。
XKD (排污许可) ent_name, credit_code, 废物代码 权威证明企业被许可产生特定危废的法定文件。
XTD (固废申报) ent_name, credit_code, 申报危废代码 记录企业实际履行申报义务的行为,是判断是否“已报”的直接证据。
YDD (用电数据) ent_name, credit_code, category 可作为辅助线索,验证企业生产活动的真实性。
XTYD (发改委企业信息) ent_name, credit_code, 行业大类, 行业小类 提供企业基础信息和行业分类,用于宏观分析。

统一标识:所有数据均以“统一社会信用代码”(credit_code)作为核心关联键,确保实体对齐。

三、技术路线与选型

面对复杂的关联分析需求,我们选择了“知识图谱 + 图数据库”的技术组合。

  • **知识图谱 (Knowledge Graph)**:将企业、危废类型视为“节点”,将“应产”、“已报”等业务逻辑视为“边”。这种结构天然适合表达复杂的关系网络,能够直观地展示数据间的关联。
  • **图数据库 (Neo 4 j)**:选用业界领先的 Neo 4 j 作为底层存储和计算引擎。其原生的图存储和强大的 Cypher 查询语言,能高效处理深度遍历和复杂模式匹配,完美契合本项目的需求。
  • Python:作为数据清洗、ETL(抽取、转换、加载)和自动化脚本的主要开发语言,利用 pandas 进行数据处理,neo4j 驱动进行数据库交互。
知识图谱:让数据“活”起来的智能网络

知识图谱(Knowledge Graph)是一种将现实世界中的实体、概念及其复杂关系进行结构化表示的技术。它不仅仅是一个数据库,更像一个由节点构成的智能网络。

  • **节点 (Nodes)**:代表现实世界中的事物,例如“企业”、“危废类型”、“行业”。
  • **边 (Edges)**:代表节点之间的关系,例如“应产”、“已报”、“属于”。

与传统的关系型数据库不同,知识图谱的核心优势在于其强大的关联分析能力。它能轻松地回答“深度”问题,比如:“持有 HW 08 废矿物油排污许可,但过去一年内没有申报记录的企业有哪些?” 这种多跳查询在关系型数据库中非常复杂,但在知识图谱中却能高效完成。

通过构建知识图谱,我们可以将分散的、孤立的数据点连接成一张巨大的信息网,从而揭示隐藏的模式、发现异常,并实现智能化的决策支持。

%%{init: {'theme': 'base', 'themeVariables': {'primaryColor':'#e6f0ff','secondaryColor':'#d5e8d4','tertiaryColor':'#ffe6cc','fontFamily':'Arial','edgeLabelBackground':'#ffffff','borderRadius':'8px'}}}%%
graph TD
    A[环评数据] --> D[输入融合]
    B[排污许可] --> D
    C[固废申报] --> D
    E[企业清单] --> D
    D --> F[构建知识图谱]
    F --> G[智能分析与报告]

    classDef data fill:#e6f0ff,stroke:#66b2ff;
    classDef process fill:#d5e8d4,stroke:#82b366;
    classDef output fill:#ffe6cc,stroke:#d79b00;

    class A,B,C,E data
    class D,F process
    class G output

四、实现方法与核心代码解析

整个流程分为三个阶段:数据准备、图谱构建、风险识别

1. 数据准备与清洗

这是最关键的一步。我们编写 Python 脚本,对五个 Excel 文件进行标准化处理,包括字段重命名、空值过滤、重复项去重,并最终生成可用于导入的结构化列表。

1
2
3
4
5
6
# 示例:清洗排污许可数据
def load_and_clean_xkd():
df = pd.read_excel(XKD_FILE)
df = df.rename(columns={'统一社会信用代码': 'credit_code', '废物代码': 'waste_code'})
df = df.dropna(subset=['credit_code', 'waste_code']).drop_duplicates()
return df[['name', 'credit_code', 'waste_code']]

2. 构建知识图谱三元组

定义图谱的本体(Ontology),并生成三元组。

  • 节点 (Node):
    • (:Enterprise {credit_code, name, industry_major, industry_minor})
    • (:WasteType {code})
  • 关系 (Relationship):
    • (:Enterprise)-[:SHOULD_PRODUCE]->(:WasteType) (来自环评/XKD)
    • (:Enterprise)-[:ACTUALLY_REPORTED]->(:WasteType) (来自 XTD)

3. 批量导入 Neo 4 j

使用 Python 的 neo4j 驱动,通过 UNWIND 批量操作高效地将数据写入图数据库。

1
2
3
4
5
6
7
8
9
10
11
def batch_import_data(driver, enterprise_nodes, waste_type_nodes, should_produce_relationships):
with driver.session() as session:
# 创建索引提升性能
session.run("CREATE INDEX enterprise_credit_code IF NOT EXISTS FOR (e:Enterprise) ON (e.credit_code);")
session.run("CREATE INDEX waste_type_code IF NOT EXISTS FOR (w:WasteType) ON (w.code);")

# 批量创建节点和关系
session.run("UNWIND $rows AS row MERGE (e:Enterprise {credit_code: row.credit_code}) SET e.name = row.name...", rows=enterprise_nodes)
session.run("UNWIND $rows AS row MERGE (:WasteType {code: row.code})", rows=waste_type_nodes)
session.run("UNWIND $rows AS row MATCH (e:Enterprise...MERGE (e)-[:SHOULD_PRODUCE]->(w)", rows=should_produce_relationships)
session.run("UNWIND $rows AS row MATCH (e:Enterprise...MERGE (e)-[:ACTUALLY_REPORTED]->(w)", rows=actually_reported_relationships)

知识图谱效果

4. 核心查询:识别“应报未报”企业

这是整个项目的核心逻辑。通过一条 Cypher 语句,即可找出所有风险企业。

1
2
3
4
5
6
7
MATCH (e:Enterprise)-[:SHOULD_PRODUCE]->(w:WasteType)
WHERE NOT (e)-[:ACTUALLY_REPORTED]->(w)
RETURN e.name AS 企业名称,
e.credit_code AS 信用代码,
e.industry_minor AS 行业小类,
collect(w.code) AS 应产未报危废代码
ORDER BY size(collect(w.code)) DESC;

逻辑解释

  • MATCH ... SHOULD_PRODUCE: 找到所有被许可或理论上应产生危废的企业-危废对。
  • WHERE NOT ... ACTUALLY_REPORTED: 筛选出这些对中,没有在申报系统中找到对应记录的情况。
  • collect(w.code): 将同一个企业漏报的所有危废代码聚合在一起。

五、效果与成果

经过上述步骤,我们的知识图谱系统成功运行,取得了显著成效:

  1. 精准识别高风险企业:系统首次运行,便从 1301 家目标企业中,精准识别出 34 家 “应报未报” 的高风险企业。

  2. 量化风险等级:系统不仅列出了企业名单,还精确指出了每家企业“应产未报”的具体危废代码,为后续执法提供了明确的靶向。

  3. 构建可视化监管视图:通过 flask+ Neo 4 j Browser 构建前后端分离的可视化界面,我们可以直观地看到企业、行业、危废类别之间的复杂关联网络,实现了从“表格数据”到“知识网络”的飞跃。

  4. 奠定智能化监管基础:该知识图谱可作为长期运行的平台,支持动态更新和持续监控,未来还可融入机器学习模型,实现更高级的风险预测。

flask可视化界面

知识图谱可视化界面

结语

本项目成功地将知识图谱技术应用于环境保护领域,有效解决了“未纳管”企业识别的难题。它不仅是一次技术上的创新,更是监管模式从“被动响应”向“主动预警”转变的生动实践。

通过融合多源数据、构建关系网络、执行智能推理,我们让沉默的数据“开口说话”,为环境监管部门提供了一双“慧眼”。未来,我们将继续优化数据融合策略(如解决子公司/分厂的实体对齐问题),并探索更复杂的图算法,不断提升监管的智能化水平,为守护绿水青山贡献科技力量。

BY

如有帮助,请收藏点赞
微信公众号:环境猫 er
CSDN : 细节处有神明
个人博客:https://maoyu92.github.io/


基于环保多元数据构建知识图谱 识别未纳管企业
https://maoyu92.github.io/2025/11/13/02 生态环境/基于多源数据融合的危废监管知识图谱构建及全量纳管异常识别/
作者
陈文茂
发布于
2025年11月13日
许可协议