package_function.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. # 封装mysql执行函数、创建节点函数
  2. import logging
  3. from flask_sqlalchemy import SQLAlchemy
  4. from app.core.graph.graph_operations import connect_graph
  5. logger = logging.getLogger(__name__)
  6. db = SQLAlchemy()
  7. def execute_sql(cur, sql, params):
  8. result = db.session.execute(sql, params)
  9. return result.fetchall()
  10. def sql_commit(sql):
  11. try:
  12. db.session.execute(sql)
  13. db.session.commit()
  14. except Exception as e:
  15. db.session.rollback()
  16. raise e
  17. def sql_execute_result(sql):
  18. try:
  19. result = db.session.execute(sql)
  20. return result.fetchall()
  21. except Exception as e:
  22. raise e
  23. # 创建或获取节点
  24. """
  25. def create_or_get_node(label, **properties):
  26. node = connect_graph().nodes.match(label, **properties).first()
  27. if node is None:
  28. node = Node(label, **properties)
  29. connect_graph().create(node)
  30. return node
  31. """
  32. # 查询是否存在节点
  33. """
  34. def get_node(label, **properties):
  35. node = connect_graph.nodes.match(label, **properties).first()
  36. # 如果没有找到匹配的节点,node 将会是 None
  37. return node
  38. """
  39. # 关系权重生成
  40. def relation_weights(relation):
  41. relation_list = ["父亲", "母亲", "儿子", "女儿"]
  42. if relation in relation_list:
  43. return 3
  44. else:
  45. return 1
  46. def workplace_weights(workplace_list, workplace):
  47. if workplace in workplace_list:
  48. return 3
  49. else:
  50. return 1
  51. def soure_organization_name(workplace):
  52. query = (
  53. f"match (n:workplace)<-[r:workin]-(subordinate_person:worker)"
  54. f"WHERE n.organization_no = '{workplace}' "
  55. f"return subordinate_person.code as code"
  56. )
  57. driver = None
  58. try:
  59. driver = connect_graph()
  60. with driver.session() as session:
  61. result = session.run(query, workplace=workplace) # type: ignore[arg-type]
  62. data = result.data()
  63. return data
  64. except (ConnectionError, ValueError) as e:
  65. logger.error(f"Neo4j数据库连接失败: {str(e)}")
  66. return []
  67. finally:
  68. if driver:
  69. driver.close()
  70. # 输入人员编码列表,得到员工与工作单位的关系,并且在此函数内完成员工,亲属,以及人-工作单位关系的创建
  71. def create_person_workplace(code_list, flag, relatives_type):
  72. nodes = []
  73. links = []
  74. condition = tuple(map(int, relatives_type.split(",")))
  75. relation_dict = {
  76. (0, 0, 0, 0): lambda: [],
  77. (0, 0, 0, 1): lambda: [],
  78. (0, 0, 1, 0): lambda: [],
  79. (0, 1, 0, 0): lambda: person_relative(links, code_list, 0),
  80. (0, 1, 0, 1): lambda: person_relative(links, code_list, 0),
  81. (0, 1, 1, 0): lambda: person_relative(links, code_list, 0),
  82. (0, 1, 1, 1): lambda: person_relative(links, code_list, 0),
  83. (1, 0, 0, 0): lambda: person_relative(links, code_list, 1),
  84. (1, 0, 0, 1): lambda: person_relative(links, code_list, 1),
  85. (1, 0, 1, 0): lambda: person_relative(links, code_list, 1),
  86. (1, 0, 1, 1): lambda: person_relative(links, code_list, 1),
  87. (1, 1, 0, 0): lambda: person_relative(links, code_list, (0, 1)),
  88. (1, 1, 0, 1): lambda: person_relative(links, code_list, (0, 1)),
  89. (1, 1, 1, 0): lambda: person_relative(links, code_list, (0, 1)),
  90. (1, 1, 1, 1): lambda: person_relative(links, code_list, (0, 1)),
  91. }
  92. query = """
  93. MATCH (n:worker)-[r:relatives]-(m:worker), (n)-[:workin]-(wrk_n:workplace), (m)-[:workin]-(wrk_m:workplace)
  94. WHERE n.code IN $codes
  95. RETURN
  96. n.name as employee,
  97. id(n) as id_n,
  98. wrk_n.name as employee_workplace,
  99. id(wrk_n) as id_wrk_n,
  100. m.name as relatives,
  101. id(m) as id_m,
  102. wrk_m.name as relatives_workplace,
  103. id(wrk_m) as id_wrk_m,
  104. CASE WHEN exists(wrk_m.organization_no) THEN 1 ELSE 0 END as relatives_status
  105. """
  106. result = []
  107. driver = None
  108. try:
  109. driver = connect_graph()
  110. with driver.session() as session:
  111. result = session.run(query, codes=code_list).data()
  112. except (ConnectionError, ValueError) as e:
  113. logger.error(f"Neo4j数据库连接失败: {str(e)}")
  114. return nodes, links
  115. finally:
  116. if driver:
  117. driver.close()
  118. handle_function = relation_dict.get(condition, []) # type: ignore[arg-type]
  119. for row in result:
  120. employee = row["employee"]
  121. id_employee = row["id_n"]
  122. employee_workplace = row["employee_workplace"]
  123. id_employee_workplace = row["id_wrk_n"]
  124. relatives = row["relatives"]
  125. id_relatives = row["id_m"]
  126. relatives_workplace = row["relatives_workplace"]
  127. id_relatives_workplace = row["id_wrk_m"]
  128. relatives_status = row["relatives_status"]
  129. nodes.extend(create_node(employee, id_employee, "selected"))
  130. nodes.extend(
  131. create_node(
  132. employee_workplace,
  133. id_employee_workplace,
  134. "work_place_selected" if flag else "internel_work_place",
  135. )
  136. )
  137. links.extend(create_relation(id_employee, id_employee_workplace, "work_in"))
  138. temp_node, temp_link = handle_condition(
  139. condition,
  140. relatives,
  141. id_relatives,
  142. relatives_workplace,
  143. id_relatives_workplace,
  144. relatives_status,
  145. )
  146. nodes.extend(temp_node)
  147. links.extend(temp_link)
  148. if condition[0] != 0 or condition[1] != 0:
  149. links.extend(handle_function())
  150. return nodes, links
  151. # 处理不同筛选条件的节点/关系
  152. def handle_condition(
  153. condition,
  154. relatives,
  155. id_relatives,
  156. relatives_workplace,
  157. id_relatives_workplace,
  158. relatives_status,
  159. ):
  160. nodes = []
  161. links = []
  162. if condition == (0, 0, 0, 1):
  163. nodes.extend(
  164. create_node(
  165. relatives_workplace,
  166. id_relatives_workplace,
  167. "" if relatives_status else "externel_work_place",
  168. )
  169. )
  170. elif condition == (0, 0, 1, 0):
  171. nodes.extend(
  172. create_node(
  173. relatives_workplace,
  174. id_relatives_workplace,
  175. "internel_work_place" if relatives_status else "",
  176. )
  177. )
  178. elif condition == (0, 0, 1, 1):
  179. nodes.extend(
  180. create_node(
  181. relatives_workplace,
  182. id_relatives_workplace,
  183. "internel_work_place" if relatives_status else "externel_work_place",
  184. )
  185. )
  186. elif condition == (0, 1, 0, 0):
  187. nodes.extend(
  188. create_node(
  189. relatives,
  190. id_relatives,
  191. "external_relatives" if relatives_status == 0 else "",
  192. )
  193. )
  194. elif condition == (0, 1, 0, 1):
  195. nodes.extend(
  196. create_node(
  197. relatives,
  198. id_relatives,
  199. "" if relatives_status else "external_relatives",
  200. )
  201. )
  202. nodes.extend(
  203. create_node(
  204. relatives_workplace,
  205. id_relatives_workplace,
  206. "" if relatives_status else "externel_work_place",
  207. )
  208. )
  209. links.extend(
  210. create_relation(
  211. id_relatives,
  212. id_relatives_workplace if relatives_status == 0 else "",
  213. "work_in",
  214. )
  215. )
  216. elif condition == (0, 1, 1, 0):
  217. nodes.extend(
  218. create_node(
  219. relatives,
  220. id_relatives,
  221. "" if relatives_status else "external_relatives",
  222. )
  223. )
  224. nodes.extend(
  225. create_node(
  226. relatives_workplace,
  227. id_relatives_workplace,
  228. "internel_work_place" if relatives_status else "",
  229. )
  230. )
  231. elif condition == (0, 1, 1, 1):
  232. nodes.extend(
  233. create_node(
  234. relatives,
  235. id_relatives,
  236. "" if relatives_status else "external_relatives",
  237. )
  238. )
  239. nodes.extend(
  240. create_node(
  241. relatives_workplace,
  242. id_relatives_workplace,
  243. "internel_work_place" if relatives_status else "externel_work_place",
  244. )
  245. )
  246. links.extend(
  247. create_relation(
  248. id_relatives,
  249. id_relatives_workplace if relatives_status == 0 else "",
  250. "work_in",
  251. )
  252. )
  253. elif condition == (1, 0, 0, 0):
  254. nodes.extend(
  255. create_node(
  256. relatives,
  257. id_relatives,
  258. "internal_relatives" if relatives_status else "",
  259. )
  260. )
  261. elif condition == (1, 0, 0, 1):
  262. nodes.extend(
  263. create_node(
  264. relatives,
  265. id_relatives,
  266. "internal_relatives" if relatives_status else "",
  267. )
  268. )
  269. nodes.extend(
  270. create_node(
  271. relatives_workplace,
  272. id_relatives_workplace,
  273. "" if relatives_status else "externel_work_place",
  274. )
  275. )
  276. elif condition == (1, 0, 1, 0):
  277. nodes.extend(
  278. create_node(
  279. relatives,
  280. id_relatives,
  281. "internal_relatives" if relatives_status else "",
  282. )
  283. )
  284. nodes.extend(
  285. create_node(
  286. relatives_workplace,
  287. id_relatives_workplace,
  288. "internel_work_place" if relatives_status else "",
  289. )
  290. )
  291. links.extend(
  292. create_relation(
  293. id_relatives,
  294. id_relatives_workplace if relatives_status else "",
  295. "work_in",
  296. )
  297. )
  298. elif condition == (1, 0, 1, 1):
  299. nodes.extend(
  300. create_node(
  301. relatives,
  302. id_relatives,
  303. "internal_relatives" if relatives_status else "",
  304. )
  305. )
  306. nodes.extend(
  307. create_node(
  308. relatives_workplace,
  309. id_relatives_workplace,
  310. "internel_work_place" if relatives_status else "externel_work_place",
  311. )
  312. )
  313. links.extend(
  314. create_relation(
  315. id_relatives,
  316. id_relatives_workplace if relatives_status else "",
  317. "work_in",
  318. )
  319. )
  320. elif condition == (1, 1, 0, 0):
  321. nodes.extend(
  322. create_node(
  323. relatives,
  324. id_relatives,
  325. "internal_relatives" if relatives_status else "external_relatives",
  326. )
  327. )
  328. elif condition == (1, 1, 0, 1):
  329. nodes.extend(
  330. create_node(
  331. relatives,
  332. id_relatives,
  333. "internal_relatives" if relatives_status else "external_relatives",
  334. )
  335. )
  336. nodes.extend(
  337. create_node(
  338. relatives_workplace,
  339. id_relatives_workplace,
  340. "externel_work_place" if relatives_status == 0 else "",
  341. )
  342. )
  343. links.extend(
  344. create_relation(
  345. id_relatives,
  346. id_relatives_workplace if relatives_status == 0 else "",
  347. "work_in",
  348. )
  349. )
  350. elif condition == (1, 1, 1, 0):
  351. nodes.extend(
  352. create_node(
  353. relatives,
  354. id_relatives,
  355. "internal_relatives" if relatives_status else "external_relatives",
  356. )
  357. )
  358. nodes.extend(
  359. create_node(
  360. relatives_workplace,
  361. id_relatives_workplace,
  362. "internel_work_place" if relatives_status else "",
  363. )
  364. )
  365. links.extend(
  366. create_relation(
  367. id_relatives,
  368. id_relatives_workplace if relatives_status else "",
  369. "work_in",
  370. )
  371. )
  372. elif condition == (1, 1, 1, 1):
  373. nodes.extend(
  374. create_node(
  375. relatives,
  376. id_relatives,
  377. "internal_relatives" if relatives_status else "external_relatives",
  378. )
  379. )
  380. nodes.extend(
  381. create_node(
  382. relatives_workplace,
  383. id_relatives_workplace,
  384. "internel_work_place" if relatives_status else "externel_work_place",
  385. )
  386. )
  387. links.extend(create_relation(id_relatives, id_relatives_workplace, "work_in"))
  388. return nodes, links
  389. # 创建节点
  390. def create_node(name, nodeid, node_type):
  391. if name in (None, "无") or node_type == "":
  392. return []
  393. return [{"name": name, "id": nodeid, "type": node_type}]
  394. # 创建关系
  395. def create_relation(start, end, relation_type):
  396. if end in (None, "无", ""):
  397. return []
  398. return [{"source": start, "target": end, "type": relation_type}]
  399. # 创建员工和亲属的关系
  400. def person_relative(links, code_list, status):
  401. query = """
  402. MATCH (n:worker)-[r:relatives]-(m:worker)
  403. WHERE n.code IN $codes
  404. {}
  405. RETURN id(STARTNODE(r)) AS startnode, r.content AS content, id(ENDNODE(r)) AS endnode
  406. """.format(
  407. "WITH CASE WHEN exists(m.code) THEN 1 ELSE 0 END AS status,r "
  408. "WHERE status = $relatives_status"
  409. if isinstance(status, int)
  410. else ""
  411. )
  412. driver = None
  413. try:
  414. driver = connect_graph()
  415. with driver.session() as session:
  416. result = session.run(query, codes=code_list, relatives_status=status).data()
  417. except (ConnectionError, ValueError) as e:
  418. logger.error(f"Neo4j数据库连接失败: {str(e)}")
  419. return links
  420. finally:
  421. if driver:
  422. driver.close()
  423. for row in result:
  424. startnode = row["startnode"]
  425. endnode = row["endnode"]
  426. content = row["content"]
  427. links.extend(create_relation(startnode, endnode, content))
  428. return links