Python代码解析:处理JSON数据并导入Neo4j数据库

news/2024/12/27 9:52:38/

Python代码解析:处理JSON数据并导入Neo4j数据库

    • 引言
    • 代码结构概览
    • 代码详解
      • 1. 导入必要的库
      • 2. 定义数据文件路径
      • 3. 读取JSON文件内容
      • 4. 连接Neo4j服务器
      • 5. 遍历数据并处理
    • 总结
    • 参考资料

引言

在数据处理和分析中,JSON是一种常见的数据格式。Neo4j是一个高性能的图数据库,能够存储和查询复杂的网络关系。本文将通过解析一段Python代码,详细介绍如何处理JSON数据并将其导入Neo4j数据库

代码结构概览

首先,我们来看一下代码的整体结构:

python">#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time     :2022/9/13 10:03
# @File     :handler_person_data.py
# @Description: 处理json数据import json
import osfrom common import constant
from common.conn_neo4j import ConnNeo4j# 获得数据文件的路径
data_path = os.path.join(constant.DATA_DIR, "data-json.json")
# 读取数据文件的内容
data = json.load(open(data_path, 'r', encoding='utf-8'))
print("人物数目:", len(data))# 连接Neo4j服务器
neo4j = ConnNeo4j()
# 遍历数据
for item in data:item['name'] = item['中文名']# 毕业于school = []if '毕业于' in item.keys():school = item['毕业于']item.pop('毕业于')# 作品works = []if '作品' in item.keys():works = item['作品']item.pop('作品')# 相关人物relate_persons = {}if '相关人物' in item.keys():relate_persons = item['相关人物']item.pop('相关人物')print(item)# 创建人物节点neo4j.create_node("人物", item)# 创建学校节点,人物与学校间的关系neo4j.create_node_relations("人物", item, "学校", school, "毕业于", {'type': '毕业于'}, False)# 创建作品节点,人物与作品间的关系neo4j.create_node_relations("人物", item, "作品", works, "创作", {'type': '创作'}, False)# 创建相关人物,人物社会关系for key in relate_persons.keys():tmp_value = relate_persons[key]tmp_rel_type = keyif key in ['儿子', '女儿', '父亲', '母亲']:neo4j.create_node_relations("人物", item, "人物", tmp_value, tmp_rel_type, {'type': '亲子'}, False)elif key in ['孙子', '孙女', '爷爷', '奶奶']:neo4j.create_node_relations('人物', item, '人物', tmp_value, tmp_rel_type, {'type': '祖孙'}, False)elif key in ['哥哥', '妹妹', '弟弟', '姐姐']:neo4j.create_node_relations('人物', item, '人物', tmp_value, tmp_rel_type, {'type': '兄弟姐妹'}, False)elif key in ['丈夫', '妻子']:neo4j.create_node_relations('人物', item, '人物', tmp_value, tmp_rel_type, {'type': '夫妻'}, False)elif key in ['女婿', '儿媳']:neo4j.create_node_relations('人物', item, '人物', tmp_value, tmp_rel_type, {'type': '婿媳'}, False)elif key in ['学生', '老师']:neo4j.create_node_relations('人物', item, '人物', tmp_value, tmp_rel_type, {'type': '师生'}, False)else:neo4j.create_node_relations('人物', item, '人物', tmp_value, tmp_rel_type, {'type': '其他'}, False)

代码详解

1. 导入必要的库

python">import json
import osfrom common import constant
from common.conn_neo4j import ConnNeo4j
  • json:用于处理JSON格式的数据。
  • os:用于处理文件路径。
  • constant:从common模块中导入的常量,可能包含数据目录等信息。
  • ConnNeo4j:从common.conn_neo4j模块中导入的Neo4j连接类。

2. 定义数据文件路径

python"># 获得数据文件的路径
data_path = os.path.join(constant.DATA_DIR, "data-json.json")
  • data_path:指向包含数据的JSON文件路径。

3. 读取JSON文件内容

python"># 读取数据文件的内容
data = json.load(open(data_path, 'r', encoding='utf-8'))
print("人物数目:", len(data))
  • 使用json.load()函数读取JSON文件的内容,并将其存储在data变量中。
  • 打印出数据中的人物数目。

4. 连接Neo4j服务器

python"># 连接Neo4j服务器
neo4j = ConnNeo4j()
  • 创建一个ConnNeo4j对象,用于连接Neo4j数据库

5. 遍历数据并处理

python"># 遍历数据
for item in data:item['name'] = item['中文名']# 毕业于school = []if '毕业于' in item.keys():school = item['毕业于']item.pop('毕业于')# 作品works = []if '作品' in item.keys():works = item['作品']item.pop('作品')# 相关人物relate_persons = {}if '相关人物' in item.keys():relate_persons = item['相关人物']item.pop('相关人物')print(item)# 创建人物节点neo4j.create_node("人物", item)# 创建学校节点,人物与学校间的关系neo4j.create_node_relations("人物", item, "学校", school, "毕业于", {'type': '毕业于'}, False)# 创建作品节点,人物与作品间的关系neo4j.create_node_relations("人物", item, "作品", works, "创作", {'type': '创作'}, False)# 创建相关人物,人物社会关系for key in relate_persons.keys():tmp_value = relate_persons[key]tmp_rel_type = keyif key in ['儿子', '女儿', '父亲', '母亲']:neo4j.create_node_relations("人物", item, "人物", tmp_value, tmp_rel_type, {'type': '亲子'}, False)elif key in ['孙子', '孙女', '爷爷', '奶奶']:neo4j.create_node_relations('人物', item, '人物', tmp_value, tmp_rel_type, {'type': '祖孙'}, False)elif key in ['哥哥', '妹妹', '弟弟', '姐姐']:neo4j.create_node_relations('人物', item, '人物', tmp_value, tmp_rel_type, {'type': '兄弟姐妹'}, False)elif key in ['丈夫', '妻子']:neo4j.create_node_relations('人物', item, '人物', tmp_value, tmp_rel_type, {'type': '夫妻'}, False)elif key in ['女婿', '儿媳']:neo4j.create_node_relations('人物', item, '人物', tmp_value, tmp_rel_type, {'type': '婿媳'}, False)elif key in ['学生', '老师']:neo4j.create_node_relations('人物', item, '人物', tmp_value, tmp_rel_type, {'type': '师生'}, False)else:neo4j.create_node_relations('人物', item, '人物', tmp_value, tmp_rel_type, {'type': '其他'}, False)
  • 遍历data中的每个JSON对象。
  • 中文名字段重命名为name
  • 处理毕业于作品相关人物字段,并将其从JSON对象中移除。
  • 打印处理后的JSON对象。
  • 调用neo4j.create_node()方法创建人物节点。
  • 调用neo4j.create_node_relations()方法创建学校、作品和相关人物节点,并建立相应的关系。

总结

通过这段代码,我们学会了如何从JSON文件中提取数据,并将其导入Neo4j数据库。这个过程包括读取JSON文件、处理数据、创建节点和关系。希望这篇文章对你理解如何处理JSON数据并导入Neo4j数据库有所帮助。

参考资料

  • Neo4j官方文档
  • Python JSON 模块文档
  • Python os 模块文档

希望这篇文章对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言。


http://www.ppmy.cn/news/1544327.html

相关文章

智慧用电监控装置:引领0.4kV安全用电新时代

在智能科技日新月异的今天,电力安全与管理正迎来一场前所未有的革新。为0.4kV以下TT、TN系统打造的智慧用电在线监控装置不仅重新定义了电力监控的边界,更为建筑安全用电筑起了一道坚不可摧的防线。 装置集成了单、三相交流电精确测量、四象限电能计量、…

详解Envoy

23-1-Envoy 你觉得为什么它能击败Nginx以及HAProxy等竞品,成为Service Mesh体系核心? Envoy 是由 Lyft 开发并开源的一款高性能开源代理,近年来迅速成为 Service Mesh 体系的核心组件之一。它之所以能够击败 Nginx 和 HAProxy 等竞品&#xf…

进程守护SuperVisord内部的进程定时监测并重启

一个swoole的wensocket程序运行在SuperVisord下端口9503 设置一个每分钟任务监测9503的端口链接数,输出链接数,并在链接数为0的情况下重启wensocket进程。 以下截图是宝塔面板环境下 #!/bin/bash current$(date %H.%M) ws9503_procnumnetstat -nat | gre…

2024年网鼎杯朱雀组|MISC

1.MISC01 文件打开一堆01,差分曼彻斯特 from libnum import * f open("data","r",encoding"utf-8") all_str f.read() f.close() out "" n (len(all_str) // 2) - 1 for i in range(0, n):tmp1 all_str[i*2:i*22]tmp…

LeetCode3226题. 使两个整数相等的位更改次数解法二(原创)

我之前文章LeetCode3226题. 使两个整数相等的位更改次数(原创)-CSDN博客对于LeetCode第3226题中给出了解法,后来思考了一下可以用位操作来完成更简洁优雅的实现: 首先计算n和k的异或值m.m中的所有位数中为1的值就是n中为1k中为0&…

【题】C#-数组:二维数组

1. 将1~10000赋值给一个二维数组(100行100列) int[,] array new int[100,100]; int index 1; for(int i 0;i < array.GetLength(0);i){for(int j 0;j < array.GetLength(1);j){array[i,j] index;index;} }2. 将二维数组的右上半部分置零 int[,] array new int[4,…

LeetCode 3165.不包含相邻元素的子序列的最大和:单点修改的线段树(动态规划)

【LetMeFly】3165.不包含相邻元素的子序列的最大和&#xff1a;单点修改的线段树&#xff08;动态规划&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/maximum-sum-of-subsequence-with-non-adjacent-elements/ 给你一个整数数组 nums 和一个二维数组 q…

如何使用Google Search Console进行关键词研究[4 种简便方法]

关键词研究是任何成功的 SEO 策略的基础要素。 通过确定正确的关键词&#xff0c;您可以更好地了解受众正在搜索什么&#xff0c;创建符合他们意图的内容&#xff0c;并为您的网站带来更多目标流量。 虽然有许多付费工具可用&#xff0c;但您可以选择 Google Search Console …