generate_mock.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. #!/usr/bin/env python3
  2. """生成图数据库格式的 mock 数据 SQL"""
  3. # 47个要素定义 - 与模板占位符完全匹配
  4. ELEMENTS = [
  5. # 文本型 - basicInfo 命名空间
  6. (1, 'basicInfo.projectCode', '项目编号', 'text', 'basicInfo', 'projectCode', True),
  7. (2, 'basicInfo.requestLevel', '申请级别', 'text', 'basicInfo', 'requestLevel', True),
  8. (3, 'basicInfo.applyAt', '申请日期', 'text', 'basicInfo', 'applyAt', False),
  9. (4, 'basicInfo.reviewObjectCertificateGetAt', '证书获取日期', 'text', 'basicInfo', 'reviewObjectCertificateGetAt', False),
  10. (5, 'basicInfo.reviewObjectCertificate2GetAt', '二次证书获取日期', 'text', 'basicInfo', 'reviewObjectCertificate2GetAt', False),
  11. (6, 'basicInfo.reviewCategory', '申请类别', 'text', 'basicInfo', 'reviewCategory', True),
  12. (7, 'basicInfo.reviewUnit', '评审单位', 'text', 'basicInfo', 'reviewUnit', True),
  13. # 文本型 - project 命名空间
  14. (8, 'project.reviewObject', '评审对象', 'text', 'project', 'reviewObject', True),
  15. (9, 'project.reviewObjectAlias', '评审对象简称', 'text', 'project', 'reviewObjectAlias', True),
  16. (10, 'project.resultScore', '评审得分', 'text', 'project', 'resultScore', True),
  17. (11, 'project.resultLevel', '评审级别', 'text', 'project', 'resultLevel', True),
  18. (12, 'project.workStartAt', '评审开始日期', 'text', 'project', 'workStartAt', True),
  19. (13, 'project.workEndAt', '评审结束日期', 'text', 'project', 'workEndAt', True),
  20. (14, 'project.createdAt', '报告日期', 'text', 'project', 'createdAt', True),
  21. (15, 'project.reviewPeriod', '评审周期', 'text', 'project', 'reviewPeriod', False),
  22. (16, 'project.closingMeetingAt', '末次评审会议时间', 'text', 'project', 'closingMeetingAt', False),
  23. # 段落型 - 章节1.1 评审对象概况
  24. (17, 'project.reviewObjectSummary', '评审对象概况', 'paragraph', 'project', 'reviewObjectSummary', True),
  25. (18, 'project.reviewObjectDescription', '评审对象描述', 'paragraph', 'project', 'reviewObjectDescription', True),
  26. (19, 'project.reviewObjectSelfAssessmentProcess', '评审对象自评过程', 'paragraph', 'project', 'reviewObjectSelfAssessmentProcess', False),
  27. (20, 'project.reviewRange', '复审范围', 'paragraph', 'project', 'reviewRange', False),
  28. (21, 'project.reviewRangeShort', '复审范围简称', 'paragraph', 'project', 'reviewRangeShort', False),
  29. # 段落型 - 章节1.2.1 目标职责
  30. (22, 'project.target', '目标', 'paragraph', 'project', 'target', True),
  31. (23, 'project.duty', '组织机构和职责', 'paragraph', 'project', 'duty', True),
  32. (24, 'project.fullParticipation', '全员参与', 'paragraph', 'project', 'fullParticipation', False),
  33. (25, 'project.safetyInvestment', '安全生产投入', 'paragraph', 'project', 'safetyInvestment', False),
  34. (26, 'project.safetyCulture', '安全文化建设', 'paragraph', 'project', 'safetyCulture', False),
  35. # 段落型 - 章节1.2.2 制度化管理
  36. (27, 'project.systematicManagement', '制度化管理', 'paragraph', 'project', 'systematicManagement', False),
  37. # 段落型 - 章节1.2.3 教育培训
  38. (28, 'project.trainingManagement', '教育培训管理', 'paragraph', 'project', 'trainingManagement', False),
  39. (29, 'project.employeeTraining', '人员教育培训', 'paragraph', 'project', 'employeeTraining', False),
  40. # 段落型 - 章节1.2.4 现场管理
  41. (30, 'project.assetManagement', '设备设施管理', 'paragraph', 'project', 'assetManagement', False),
  42. (31, 'project.jobSafety', '作业安全', 'paragraph', 'project', 'jobSafety', False),
  43. (32, 'project.positionQualified', '岗位达标', 'paragraph', 'project', 'positionQualified', False),
  44. (33, 'project.partner', '相关方', 'paragraph', 'project', 'partner', False),
  45. (34, 'project.occupationalHealth', '职业健康', 'paragraph', 'project', 'occupationalHealth', False),
  46. # 段落型 - 章节1.2.5 安全风险管控及隐患排查治理
  47. (35, 'project.riskAssessment', '风险辨识与评价', 'paragraph', 'project', 'riskAssessment', False),
  48. (36, 'project.majorHazardManagement', '重大危险源管理', 'paragraph', 'project', 'majorHazardManagement', False),
  49. (37, 'project.hazardInspection', '隐患排查', 'paragraph', 'project', 'hazardInspection', False),
  50. (38, 'project.changeManagement', '变更管理', 'paragraph', 'project', 'changeManagement', False),
  51. (39, 'project.earlyWarning', '预测预警', 'paragraph', 'project', 'earlyWarning', False),
  52. # 段落型 - 章节1.2.6 应急救援
  53. (40, 'project.emergencyResponse', '应急救援', 'paragraph', 'project', 'emergencyResponse', False),
  54. # 段落型 - 章节1.2.7 事故管理
  55. (41, 'project.incidentManagement', '事故管理', 'paragraph', 'project', 'incidentManagement', False),
  56. # 段落型 - 章节1.2.8 持续改进
  57. (42, 'project.continuousImprovement', '持续改进', 'paragraph', 'project', 'continuousImprovement', False),
  58. # 段落型 - 章节1.3 安全生产标准化建设
  59. (43, 'project.safetyStandardizationStatus', '安全生产标准化建设和持续运行情况', 'paragraph', 'project', 'safetyStandardizationStatus', False),
  60. # 段落型 - 章节1.4 安全生产管理亮点
  61. (44, 'project.safetyHighlight', '安全生产管理亮点', 'paragraph', 'project', 'safetyHighlight', False),
  62. # 段落型 - 其他
  63. (45, 'project.workProcess', '现场复审工作过程', 'paragraph', 'project', 'workProcess', False),
  64. (46, 'project.moreWorkReference', '工作依据', 'paragraph', 'project', 'moreWorkReference', False),
  65. # 表格型
  66. (47, '+expert_list', '专家组成员表', 'table', None, 'expert_list', True),
  67. ]
  68. # 要素值 - 与模板占位符匹配
  69. VALUES = {
  70. # 文本型
  71. 'basicInfo.projectCode': 'BZ-0092-2024',
  72. 'basicInfo.requestLevel': '一级',
  73. 'basicInfo.applyAt': '2024年7月8日',
  74. 'basicInfo.reviewObjectCertificateGetAt': '2019年12月9日',
  75. 'basicInfo.reviewObjectCertificate2GetAt': '2015年4月7日',
  76. 'basicInfo.reviewCategory': '电力勘测设计企业',
  77. 'basicInfo.reviewUnit': '湖北安源安全环保科技有限公司',
  78. 'project.reviewObject': '中国电建集团成都勘测设计研究院有限公司',
  79. 'project.reviewObjectAlias': '成都院',
  80. 'project.resultScore': '93.33',
  81. 'project.resultLevel': '一级',
  82. 'project.workStartAt': '2024年7月13日',
  83. 'project.workEndAt': '2024年10月17日',
  84. 'project.createdAt': '2024年11月',
  85. 'project.reviewPeriod': '2023年7月8日-2024年7月8日',
  86. 'project.closingMeetingAt': '2024年10月17日',
  87. # 段落型 - 章节1.1
  88. 'project.reviewObjectSummary': '中国电建集团成都勘测设计研究院有限公司(简称:成都院)成立于2005年,是世界500强企业中国电力建设集团的核心成员企业。作为国家级高新技术企业,成都院以水利水电、新能源和基础设施为核心业务,在水电工程领域承担了金沙江、大渡河、雅砻江等重大河流的规划勘测设计工作,创造了多项"中国第一"和"世界之最"。成都院拥有注册资本50亿元人民币,专业技术人员规模近3000人,累计获得4443项专利和100项行业资质认证,展现了雄厚的技术研发实力。',
  89. 'project.reviewObjectDescription': '中国电建集团成都勘测设计研究院有限公司(简称:成都院)是中国电力建设集团核心成员企业,作为国内领先的清洁能源工程服务商,成都院在水利水电、新能源及基础设施领域具有突出优势。成都院深度参与了国家西部大开发和"西电东送"战略,承担了包括两河口水电站、杨房沟水电站、乌东德水电站等重大工程的勘测设计工作,其中两河口水电站拥有世界最高土石坝的纪录。',
  90. 'project.reviewObjectSelfAssessmentProcess': '成都院于2024年3月启动安全生产标准化复审自评工作,成立了以总经理为组长的自评工作领导小组,制定了详细的自评工作方案。自评工作历时3个月,覆盖公司本部及所有在建项目,共发现问题隐患127项,已全部完成整改。',
  91. # 段落型 - 章节1.2.1 目标职责
  92. 'project.target': '成都院制定并发布《QHSE"十四五"规划》(安质〔2023〕1号),明确了总体安全生产目标,包括7项安全管理及事故控制目标,总体目标为公司"十四五"规划的子规划,安全生产与职业健康工作目标纳入总体生产经营目标。成都院发布《关于印发<成都院2024年安全生产与职业健康、能源节约与生态环境保护工作目标和重点>的通知》(蓉设安质〔2024〕18号),明确了2024年安全生产与职业健康目标,包括9项安全管理目标和10项事故控制目标。',
  93. 'project.duty': '成都院建立了完善的安全生产组织机构体系,设立了安全生产委员会作为最高决策机构,下设安全质量环保部作为专职管理部门。公司各级领导班子成员均签订了安全生产责任书,明确了"党政同责、一岗双责"的安全生产责任制。各部门、各项目部均配备了专(兼)职安全管理人员,形成了横向到边、纵向到底的安全管理网络。',
  94. 'project.fullParticipation': '成都院建立了全员参与的安全生产管理机制,通过安全生产责任制的层层签订,将安全责任落实到每一位员工。公司定期组织安全生产培训和应急演练,提高全员安全意识和应急处置能力。建立了安全隐患举报奖励制度,鼓励员工积极参与安全管理。',
  95. 'project.safetyInvestment': '成都院严格执行安全生产费用提取和使用制度,按照规定比例提取安全生产费用,专款专用。2024年度安全生产投入总额达到2500万元,主要用于安全设施设备更新、安全培训教育、应急救援物资储备等方面。',
  96. 'project.safetyCulture': '成都院积极推进安全文化建设,将安全理念融入企业文化体系。通过开展"安全生产月"、"安全知识竞赛"等活动,营造浓厚的安全文化氛围。建立了安全文化展示厅,展示公司安全发展历程和典型案例。',
  97. # 段落型 - 章节1.2.2 制度化管理
  98. 'project.systematicManagement': '成都院建立了完善的安全生产规章制度体系,涵盖安全生产责任制、安全生产管理制度、安全操作规程等方面。公司定期对制度进行评审和修订,确保制度的适用性和有效性。建立了制度执行情况检查机制,确保各项制度落实到位。',
  99. # 段落型 - 章节1.2.3 教育培训
  100. 'project.trainingManagement': '成都院建立了完善的安全教育培训管理制度,制定了年度培训计划,明确了培训内容、培训对象和培训要求。公司设立了专门的培训管理部门,配备了专职培训管理人员,建立了培训档案管理系统。',
  101. 'project.employeeTraining': '成都院严格执行三级安全教育培训制度,新员工入职必须完成公司级、部门级、班组级三级安全教育培训。特种作业人员全部持证上岗,证书有效期内复审率达到100%。2024年度共组织各类安全培训156次,培训人员达到8500人次。',
  102. # 段落型 - 章节1.2.4 现场管理
  103. 'project.assetManagement': '成都院建立了完善的设备设施管理制度,对所有生产设备设施实行台账管理。定期开展设备设施安全检查和维护保养,确保设备设施处于良好状态。特种设备全部按规定进行检验检测,检验合格率达到100%。',
  104. 'project.jobSafety': '成都院严格执行作业安全管理制度,对高风险作业实行作业许可制度。建立了作业风险分析和控制措施制度,作业前必须进行风险辨识和安全交底。配备了完善的个人防护用品,确保作业人员安全。',
  105. 'project.positionQualified': '成都院建立了岗位达标管理制度,明确了各岗位的安全生产职责和能力要求。定期开展岗位达标考核,考核结果与绩效挂钩。2024年度岗位达标率达到98%以上。',
  106. 'project.partner': '成都院建立了相关方安全管理制度,对承包商、供应商等相关方实行准入管理。签订安全生产协议,明确双方安全责任。定期对相关方进行安全检查和评价,不合格的相关方及时清退。',
  107. 'project.occupationalHealth': '成都院建立了职业健康管理制度,定期开展职业病危害因素检测和员工职业健康体检。配备了完善的职业病防护设施和个人防护用品。建立了职业健康档案,实行动态管理。',
  108. # 段落型 - 章节1.2.5 安全风险管控
  109. 'project.riskAssessment': '成都院建立了安全风险辨识与评价制度,定期开展全面的风险辨识和评价工作。建立了风险分级管控清单,明确了各级风险的管控措施和责任人。对重大风险实行挂牌督办,确保风险可控。',
  110. 'project.majorHazardManagement': '成都院建立了重大危险源管理制度,对辨识出的重大危险源实行登记建档、定期检测、评估监控。制定了重大危险源应急预案,定期开展应急演练。',
  111. 'project.hazardInspection': '成都院建立了隐患排查治理制度,实行分级排查、分类治理。建立了隐患排查治理信息系统,实现隐患的闭环管理。2024年度共排查隐患1256项,整改率达到100%。',
  112. 'project.changeManagement': '成都院建立了变更管理制度,对人员、设备、工艺、环境等方面的变更实行审批管理。变更前进行风险评估,变更后进行验收确认,确保变更安全可控。',
  113. 'project.earlyWarning': '成都院建立了安全预测预警机制,利用信息化手段对安全生产状况进行实时监控和分析。建立了安全生产预警指标体系,及时发布预警信息,采取预防措施。',
  114. # 段落型 - 章节1.2.6 应急救援
  115. 'project.emergencyResponse': '成都院建立了完善的应急救援体系,制定了综合应急预案和专项应急预案。配备了应急救援物资和装备,建立了应急救援队伍。定期开展应急演练,提高应急处置能力。2024年度共组织应急演练32次。',
  116. # 段落型 - 章节1.2.7 事故管理
  117. 'project.incidentManagement': '成都院建立了事故管理制度,明确了事故报告、调查、处理和统计分析的程序和要求。建立了事故案例库,定期开展事故案例学习和警示教育。复审期内未发生生产安全事故。',
  118. # 段落型 - 章节1.2.8 持续改进
  119. 'project.continuousImprovement': '成都院建立了安全生产持续改进机制,定期开展安全生产绩效评估和管理评审。根据评估结果制定改进措施,持续提升安全生产管理水平。建立了安全生产标准化建设长效机制,确保标准化工作持续有效运行。',
  120. # 段落型 - 章节1.3
  121. 'project.safetyStandardizationStatus': '成都院自2015年首次通过电力勘测设计企业一级安全生产标准化评审以来,始终坚持标准化建设不放松,持续完善安全生产管理体系。公司将安全生产标准化建设纳入年度工作计划,定期开展自评和整改,确保标准化工作持续有效运行。',
  122. # 段落型 - 章节1.4
  123. 'project.safetyHighlight': '成都院在安全生产管理方面形成了多项亮点:一是建立了智慧安全管理平台,实现了安全管理信息化、智能化;二是创新了"安全+党建"工作模式,将安全工作与党建工作深度融合;三是建立了安全生产标准化建设长效机制,确保标准化工作持续有效运行。',
  124. }
  125. def escape_sql(s):
  126. if s is None:
  127. return 'NULL'
  128. return "'" + s.replace("'", "''") + "'"
  129. def generate_sql():
  130. lines = []
  131. lines.append("-- 灵越智报 Mock 数据 (图数据库格式)")
  132. lines.append("-- 生成时间: 2026-03-02")
  133. lines.append("")
  134. # 项目节点
  135. lines.append("-- 项目节点")
  136. lines.append("INSERT INTO nodes (id, node_type, node_key, name, status, created_by) VALUES")
  137. lines.append("(10, 'PROJECT', 'PRJ-2024-001', '成都院2024年复审报告', 'draft', 1)")
  138. lines.append("ON CONFLICT (id) DO NOTHING;")
  139. lines.append("")
  140. # 要素定义节点
  141. lines.append("-- 要素定义节点 (47个)")
  142. for i, elem in enumerate(ELEMENTS):
  143. elem_id, elem_key, elem_name, elem_type, namespace, field_name, required = elem
  144. node_id = 700 + elem_id
  145. lines.append(f"INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES ({node_id}, 'ELEMENT', {escape_sql(elem_key)}, {escape_sql(elem_name)}, 1) ON CONFLICT (id) DO NOTHING;")
  146. lines.append("")
  147. # 要素定义属性
  148. lines.append("-- 要素定义属性")
  149. for elem in ELEMENTS:
  150. elem_id, elem_key, elem_name, elem_type, namespace, field_name, required = elem
  151. node_id = 700 + elem_id
  152. lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({node_id}, 'element_type', {escape_sql(elem_type)}) ON CONFLICT (node_id, prop_key) DO NOTHING;")
  153. if namespace:
  154. lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({node_id}, 'namespace', {escape_sql(namespace)}) ON CONFLICT (node_id, prop_key) DO NOTHING;")
  155. if field_name:
  156. lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({node_id}, 'field_name', {escape_sql(field_name)}) ON CONFLICT (node_id, prop_key) DO NOTHING;")
  157. lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({node_id}, 'required', {'true' if required else 'false'}) ON CONFLICT (node_id, prop_key) DO NOTHING;")
  158. lines.append("")
  159. # 要素值节点
  160. lines.append("-- 要素值节点 (47个)")
  161. for elem in ELEMENTS:
  162. elem_id, elem_key, elem_name, elem_type, namespace, field_name, required = elem
  163. value_node_id = 800 + elem_id
  164. value_key = f"PRJ-2024-001:{elem_key}"
  165. lines.append(f"INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES ({value_node_id}, 'VALUE', {escape_sql(value_key)}, {escape_sql(elem_name + '值')}, 1) ON CONFLICT (id) DO NOTHING;")
  166. lines.append("")
  167. # 要素值属性
  168. lines.append("-- 要素值属性")
  169. for elem in ELEMENTS:
  170. elem_id, elem_key, elem_name, elem_type, namespace, field_name, required = elem
  171. value_node_id = 800 + elem_id
  172. value_text = VALUES.get(elem_key)
  173. is_filled = 'true' if value_text else 'false'
  174. lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({value_node_id}, 'is_filled', '{is_filled}') ON CONFLICT (node_id, prop_key) DO NOTHING;")
  175. if value_text:
  176. lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({value_node_id}, 'value_text', {escape_sql(value_text)}) ON CONFLICT (node_id, prop_key) DO NOTHING;")
  177. lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({value_node_id}, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;")
  178. lines.append("")
  179. # HAS_ELEMENT 关系
  180. lines.append("-- HAS_ELEMENT 关系")
  181. for i, elem in enumerate(ELEMENTS):
  182. elem_id = elem[0]
  183. node_id = 700 + elem_id
  184. lines.append(f"INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, {node_id}, {i+1}) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;")
  185. lines.append("")
  186. # HAS_VALUE 关系
  187. lines.append("-- HAS_VALUE 关系")
  188. for elem in ELEMENTS:
  189. elem_id = elem[0]
  190. value_node_id = 800 + elem_id
  191. lines.append(f"INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, {value_node_id}) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;")
  192. lines.append("")
  193. # FOR_ELEMENT 关系
  194. lines.append("-- FOR_ELEMENT 关系")
  195. for elem in ELEMENTS:
  196. elem_id = elem[0]
  197. elem_node_id = 700 + elem_id
  198. value_node_id = 800 + elem_id
  199. lines.append(f"INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', {value_node_id}, {elem_node_id}) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;")
  200. lines.append("")
  201. # 附件节点
  202. lines.append("-- 附件节点")
  203. lines.append("INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (400, 'ATTACHMENT', 'ATT-001', '01-复审通知', 1) ON CONFLICT (id) DO NOTHING;")
  204. lines.append("INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (401, 'ATTACHMENT', 'ATT-002', '02-评审报告原文', 1) ON CONFLICT (id) DO NOTHING;")
  205. lines.append("INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (402, 'ATTACHMENT', 'ATT-003', '03-安全标准化达标证书', 1) ON CONFLICT (id) DO NOTHING;")
  206. lines.append("")
  207. # 附件属性
  208. lines.append("-- 附件属性")
  209. for att_id, name, size in [(400, '复审通知.docx', 102400), (401, '评审报告.pdf', 512000), (402, '达标证书.pdf', 256000)]:
  210. lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({att_id}, 'file_name', '{name}') ON CONFLICT (node_id, prop_key) DO NOTHING;")
  211. lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({att_id}, 'parse_status', 'completed') ON CONFLICT (node_id, prop_key) DO NOTHING;")
  212. lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_number) VALUES ({att_id}, 'file_size', {size}) ON CONFLICT (node_id, prop_key) DO NOTHING;")
  213. lines.append("")
  214. # HAS_ATTACHMENT 关系
  215. lines.append("-- HAS_ATTACHMENT 关系")
  216. lines.append("INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ATTACHMENT', 10, 400, 1) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;")
  217. lines.append("INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ATTACHMENT', 10, 401, 2) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;")
  218. lines.append("INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ATTACHMENT', 10, 402, 3) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;")
  219. lines.append("")
  220. # 实体节点
  221. lines.append("-- 实体节点")
  222. entities = [
  223. (500, 'ORG:成都院', '中国电建集团成都勘测设计研究院有限公司', 'ORG', '评审对象'),
  224. (501, 'ORG:成都院简称', '成都院', 'ORG', '评审对象简称'),
  225. (502, 'CODE:BZ-0092-2024', 'BZ-0092-2024', 'CODE', '项目编号'),
  226. (503, 'DATE:开始', '2024年7月13日', 'DATE', '评审开始日期'),
  227. (504, 'DATE:结束', '2024年10月17日', 'DATE', '评审结束日期'),
  228. (505, 'NUMBER:得分', '93.33', 'NUMBER', '评审得分'),
  229. (506, 'DATE:申请', '2024年7月8日', 'DATE', '申请日期'),
  230. (507, 'DATE:证书', '2019年12月9日', 'DATE', '证书获取日期'),
  231. ]
  232. for ent_id, ent_key, ent_text, ent_type, label in entities:
  233. lines.append(f"INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES ({ent_id}, 'ENTITY', {escape_sql(ent_key)}, {escape_sql(ent_text)}, 1) ON CONFLICT (id) DO NOTHING;")
  234. lines.append("")
  235. # 实体属性
  236. lines.append("-- 实体属性")
  237. for ent_id, ent_key, ent_text, ent_type, label in entities:
  238. lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({ent_id}, 'entity_type', '{ent_type}') ON CONFLICT (node_id, prop_key) DO NOTHING;")
  239. lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({ent_id}, 'business_label', {escape_sql(label)}) ON CONFLICT (node_id, prop_key) DO NOTHING;")
  240. lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_number) VALUES ({ent_id}, 'confidence', 0.95) ON CONFLICT (node_id, prop_key) DO NOTHING;")
  241. lines.append("")
  242. # HAS_ENTITY 关系
  243. lines.append("-- HAS_ENTITY 关系")
  244. for ent_id, _, _, _, _ in entities:
  245. lines.append(f"INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_ENTITY', 400, {ent_id}) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;")
  246. lines.append("")
  247. # 更新序列
  248. lines.append("-- 更新序列")
  249. lines.append("SELECT setval('nodes_id_seq', (SELECT COALESCE(MAX(id), 1) FROM nodes));")
  250. lines.append("SELECT setval('edges_id_seq', (SELECT COALESCE(MAX(id), 1) FROM edges));")
  251. lines.append("SELECT setval('node_properties_id_seq', (SELECT COALESCE(MAX(id), 1) FROM node_properties));")
  252. lines.append("")
  253. lines.append("SELECT '47个要素 Mock 数据导入完成' AS result;")
  254. return '\n'.join(lines)
  255. if __name__ == '__main__':
  256. print(generate_sql())