Python 图算法系列29-大规模图关系建立-step1导入数据

news2024/9/24 5:30:47

说明

这里指的是从文件类型开始,将数据规范为所需的格式,然后存储。

内容

1 文件操作

压缩文件

rar a some_file.rar some_file.csv

获取文件

rsync -rvltz -e 'ssh -p 22' --progress root@IP:/data/graph_data graph_data

解压文件

apt install unrar

# e 忽略文件结构解压 , x 保持文件结构
unrar e filname.csv.rar

在获得了文件之后,需要对超大文件操作Python一些可能用的到的函数系列28 超大文本文件分割读取。

获取文件末尾n行:

import os 
# 采用偏置方法读取末尾三百行文本
def read_tail_n(fname, n_lines):
    off = - 100 # 偏置量
    min_size = - os.path.getsize(fname) # 最小量
    with open(fname,'rb+') as f:
        while True:
            if off < min_size:
                f.seek(min_size, 2)
                res_lines = f.readlines()
                break
            f.seek(off, 2) # 2 代表文件末尾,往回追 off个字符
            lines= f.readlines()
            if len(lines) >  n_lines + 1:
                res_lines = lines[-n_lines:]
                break
            off *= 2
    return res_lines

读取中间n行

def read_somelines_mem(filename,  start_line = 1 , end_line = 100):
    f = open(filename, 'r')
    line_count = 0
    start_line -= 1 # 和数组索引对齐
    lines = []
    for i in range(end_line): # 从头开始循环
        line = f.readline()
        if line_count >= start_line:
            lines.append(line)
        line_count +=1  # line_count是行指针
    f.close()
    return lines

获取文件总行数

# 读取大文件行数
def nrow_big_txt(filename):
    cnt = 0
    with open(filename,'r') as f:
        for line in f:
            cnt+=1
    print('total lines: %s' % cnt)
    return cnt

处理时,假设我们每次只处理1千万条

# 读取5000万~6000万行
test1 = read_somelines_mem('filename.csv', 50000000, 60000000)
# 对可能存在的极少数问题清洗(理论上,4个字段应该一个也不缺)
test2 = [x.replace(',,',',').replace('\n','').split(',') for x in test1]
test3 = [x for x in test2 if len(x) ==4]

最终获得的文件大约为30G。

2.9G	company_node_batch1.csv
2.8G	company_node_batch2.csv
2.8G	company_node_batch3.csv
2.0G	company_node_batch4.csv
2.1G	contact_rel_part1.csv
2.1G	contact_rel_part2.csv
2.1G	contact_rel_part3.csv
2.1G	contact_rel_part4.csv
1.9G	xxx.csv
310M	invest_rel_v2.csv
2.3G	xxx1.csv

2 数据规范

该保留节点的就保留节点

之前犯过一个迷糊,就是去掉了一类联系节点,之间建立两点间的边。然后就发生了数据爆炸,因为联系节点会有多个节点与之关联,去掉后产生了n平方的边数。(100*100=1万)。这应该还是属于基本的思维方式错误。

按图的思想,每一类实体,该分类的就分类,而不必在意业务场景的特殊性。只要最后可以用流畅的自然语言表达就行,例如:Company(A) HasContact Phone(B)

将数据保存为csv形式,大致的格式如下。

对于节点来说, ID和LABEL是必须的。ID可以简单理解为数据的主键,LABEL则是数据的表(Table)或集合(Collection)。

对于边来说, STARD_ID、END_ID、TYPE构成了一条边,STARD_ID和END_ID是起点和终点,需要注意的是,边声明的节点必须已存在于图中,否则会失败

额外的一点是,被声明为ID的列会被默认为字符型。所以即使id看起来是数值的,也会被当成字符处理。

company.csv 
id:ID,name,:LABEL
100,a01,Company
101,a02,Company
102,a03,Company


contact.csv
id:ID,name,:LABEL
200,1311111111,Phone
201,1322222222,Phone

company_invest_rel.csv 
:START_ID,:END_ID,per:float,:TYPE
100,101,0.5,Invest


contact_rel.csv
:START_ID,:END_ID,:TYPE
100,200,HasContact
101,200,HasContact
101,201,HasContact
102,201,HasContact

在使用pandas保存相应csv时可以参考以下语句

invest_rel_df.to_csv('invest_rel_v2.csv', index=False, encoding='utf-8', quoting=1)  
数据模型【Nice To Have】

原始数据可能存在少量数据问题,为了确保后续可以正确的大批量处理,设定数据模型进行限定和转换。

from typing import List,Dict,Optional
from pydantic import BaseModel

class Relation(BaseModel):
    rid : int 
    from_id: int 
    to_id: int 
    link_attr: str 
    link_typr:int 

class Relation_s(BaseModel):
    data_list : List[Relation]

test1 = read_somelines_mem('ds_lianxi_relation_e0.csv', 0,10000)
test2 = [x.replace(',,',',').replace('\n','').split(',') for x in test1]
test3 = [x for x in test2 if len(x) ==4]

tem_df = pd.DataFrame(test3, columns = ['from_id','to_id','link_attr','link_typr'])
tem_df['rid']= list(range(len(tem_df)))

sample_lod = tem_df.to_dict(orient='records')

rs = Relation_s(data_list = sample_lod[:3])
rs1 = [x.dict() for x in rs.data_list]

[{'rid': 0,
  'from_id': 76247745,
  'to_id': 25278409,
  'link_attr': '111111111',
  'link_typr': 1},
 {'rid': 1,
  'from_id': 24115962,
  'to_id': 22426271,
  'link_attr': '22222222',
  'link_typr': 1},
 {'rid': 2,
  'from_id': 68525645,
  'to_id': 66453181,
  'link_attr': '3333333@qq.com',
  'link_typr': 3}]

3 数据导入

当数据较多的时候,使用 neo4j-admin import是比较合适的方法。

假设是通过docker启动的neo4j。

通过bash方式启动容器(默认的entry point 会直接启动neo4j)

proc_path=/opt/aprojects/Neo4j_24535_36
data_path=/data/aprojects/Neo4j_24535_36
image_name="registry.cn-hangzhou.aliyuncs.com/andy08008/neo4j_5:v100"

# 操作数据
docker run -it \
    --name='Neo4j_24535_36' \
    --restart=always \
    -v /etc/localtime:/etc/localtime  \
    -v /etc/timezone:/etc/timezone \
    -v /etc/hostname:/workspace/hostname \
    -e "LANG=C.UTF-8" \
    -v ${data_path}/data:/data \
    -v ${data_path}/logs:/logs \
    -v ${proc_path}/conf4:/var/lib/neo4j/conf/ \
    -v /data/neo4j_import:/var/lib/neo4j/import \
    -v ${proc_path}/plugins4:/var/lib/neo4j/plugins \
    --env NEO4J_AUTH=neo4j/xxxxxx \
    -p 24535:7474 \
    -p 24536:7687 \
    ${image_name} bash 

然后确保neo4j停止时导入(neo4j stop),可以导入多个节点和边的文件。

neo4j-admin database import full --nodes=import/company_node_batch1.csv --nodes=import/company_node_batch2.csv --nodes=import/company_node_batch3.csv --nodes=import/company_node_batch4.csv --nodes=import/xxx.csv --nodes=import/xxxx.csv --relationships=import/invest_rel_v2.csv  --relationships=import/contact_rel_part1.csv --relationships=import/contact_rel_part2.csv --relationships=import/contact_rel_part3.csv --relationships=import/contact_rel_part4.csv --overwrite-destination --verbose

导入过程中会不断给到反馈

Neo4j version: 5.23.0
Importing the contents of these files into /data/databases/neo4j:
Nodes:
  /var/lib/neo4j/import/company_node_batch1.csv
  /var/lib/neo4j/import/company_node_batch2.csv
  /var/lib/neo4j/import/company_node_batch3.csv
  /var/lib/neo4j/import/company_node_batch4.csv
  /var/lib/neo4j/import/xxx.csv
  /var/lib/neo4j/import/xxxx.csv

Relationships:
  /var/lib/neo4j/import/invest_rel_v2.csv
  /var/lib/neo4j/import/contact_rel_part1.csv
  /var/lib/neo4j/import/contact_rel_part2.csv
  /var/lib/neo4j/import/contact_rel_part3.csv
  /var/lib/neo4j/import/contact_rel_part4.csv

Available resources:
  Total machine memory: 47.04GiB
  Free machine memory: 20.71GiB
  Max heap memory : 11.77GiB
  Max worker threads: 8
  Configured max memory: 483.9MiB
  High parallel IO: true

Cypher type normalization is enabled (disable with --normalize-types=false):
  Property type of 'regcap' normalized from 'float' --> 'double' in /var/lib/neo4j/import/company_node_batch1.csv
  Property type of 'socnum' normalized from 'int' --> 'long' in /var/lib/neo4j/import/company_node_batch1.csv
  Property type of 'regcap' normalized from 'float' --> 'double' in /var/lib/neo4j/import/company_node_batch2.csv
  Property type of 'socnum' normalized from 'int' --> 'long' in /var/lib/neo4j/import/company_node_batch2.csv
  Property type of 'regcap' normalized from 'float' --> 'double' in /var/lib/neo4j/import/company_node_batch3.csv
  Property type of 'socnum' normalized from 'int' --> 'long' in /var/lib/neo4j/import/company_node_batch3.csv
  Property type of 'regcap' normalized from 'float' --> 'double' in /var/lib/neo4j/import/company_node_batch4.csv
  Property type of 'socnum' normalized from 'int' --> 'long' in /var/lib/neo4j/import/company_node_batch4.csv
Nodes, started 2024-09-23 06:28:28.070+0000
[*Nodes:0B/s 2.192GiB-------------------------------------------------------------------------] 224M ∆3.92M
Done in 3m 1s 796ms
Prepare node index, started 2024-09-23 06:31:29.907+0000
[*:3.030GiB-----------------------------------------------------------------------------------] 674M ∆    0
Done in 1m 25s 278ms
Relationships, started 2024-09-23 06:32:55.193+0000
[*Relationships:0B/s 3.030GiB-----------------------------------------------------------------] 245M ∆ 560K
Done in 6m 59s 93ms
Node Degrees, started 2024-09-23 06:39:57.991+0000
[*>(2)================================================|CALCULATE:2.593GiB(5)==================] 245M ∆ 8.4M
Done in 22s 771ms
Relationship --> Relationship 1/2, started 2024-09-23 06:40:21.526+0000
[>(2)=================|*LINK(4)==================================|v:130.4MiB/s----------------] 245M ∆7.32M
Done in 1m 1s 948ms
RelationshipGroup 1/2, started 2024-09-23 06:41:23.480+0000
[>:2.097GiB/s--|>|*v:240.6KiB/s---------------------------------------------------------------] 106M ∆ 106M
Done in 1s 469ms
Node --> Relationship, started 2024-09-23 06:41:24.958+0000
[>:122.6MiB/s---------|*>(3)========================|LINK--------------|v:196.1MiB/s(3)=======] 191M ∆35.7M
Done in 14s 914ms
Relationship <-- Relationship 1/2, started 2024-09-23 06:41:39.882+0000
[>--------------------------------|*LINK(5)===========================|v:142.0MiB/s-----------] 245M ∆ 7.2M
Done in 56s 596ms
Relationship --> Relationship 2/2, started 2024-09-23 06:42:39.009+0000
[>(2)================================|*LINK(4)============================|v:33.04MiB/s-------] 245M ∆8.64M
Done in 45s 314ms
RelationshipGroup 2/2, started 2024-09-23 06:43:24.325+0000
[*>(6)=============================================================================|v:8.104MiB] 220M ∆ 220M
Done in 1s 616ms
Relationship <-- Relationship 2/2, started 2024-09-23 06:43:25.965+0000
[*>(2)=============================================================|LINK(4)==========|v:40.18M] 245M ∆6.84M
Done in 37s 627ms
Count groups, started 2024-09-23 06:44:04.283+0000
[>|*>--------------------------------------------------------------------------------|COUNT:93] 349K ∆ 349K
Done in 143ms
Gather, started 2024-09-23 06:44:11.745+0000
[>----------------|*CACHE:2.619GiB------------------------------------------------------------] 349K ∆ 349K
Done in 179ms
Write, started 2024-09-23 06:44:11.935+0000
[*>:??-----------------------------------------------------------------------|EN|v:??---------] 349K ∆ 349K
Done in 676ms
Node --> Group, started 2024-09-23 06:44:12.717+0000
[>---|*FIRST-----------------------------------------------------------------------------|v:1.] 340K ∆ 119K
Done in 3s 319ms
Node counts and label index build, started 2024-09-23 06:44:18.512+0000
[*>(3)===================================|LABEL INDEX-------------------------|COUNT:2.174GiB(] 224M ∆24.1M
Done in 16s 843ms
Relationship counts and relationship type index build, started 2024-09-23 06:44:35.898+0000
[>-------------------------|RELATIONSHIP TYPE|*COUNT------------------------------------------] 245M ∆ 380K
Done in 1m 51s 188ms

IMPORT DONE in 18m 1s 685ms.
Imported:
  224894968 nodes
  245297705 relationships
  878241672 properties
Peak memory usage: 3.030GiB

成功后启动neo4j(neo4j start)

root@457931a3e173:/var/lib/neo4j# neo4j start
Directories in use:
home:         /var/lib/neo4j
config:       /var/lib/neo4j/conf
logs:         /logs
plugins:      /var/lib/neo4j/plugins
import:       /var/lib/neo4j
data:         /var/lib/neo4j/data
certificates: /var/lib/neo4j/certificates
licenses:     /var/lib/neo4j/licenses
run:          /var/lib/neo4j/run
Starting Neo4j.
Started neo4j (pid:2429). It is available at http://0.0.0.0:7474
There may be a short delay until the server is ready.

然后就可以在前端访问了,第一步导入数据结束。

在使用时需要先设置索引,整个过程也是比较快的。

从数据导入到索引完成,总共花费约30分钟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2159480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

教师管理系统小程序+ssm论文源码调试讲解

第二章 开发工具及关键技术介绍 2.1 JAVA技术 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterrise JavaBeans&#xff09;的全面支持&#xff0c;java servlet AI&#xff0c;JS&#xff08;java server ages&…

TCL25届校招测评笔试TAS人才测评题库:高分攻略真题分析

&#x1f31f; 职场新人必看&#xff1a;TCL校招测评全解析 &#x1f31f; 亲爱的小伙伴们&#xff0c;你是否正准备踏入职场&#xff0c;或是对即将到来的校招感到既兴奋又紧张&#xff1f;今天&#xff0c;我将带你深入了解TCL校招中的TAS人才测评&#xff0c;让你在面试前做…

Flutter鸿蒙化环境配置(windows)

Flutter鸿蒙化环境配置&#xff08;windows&#xff09; 参考资料Window配置Flutter的鸿蒙化环境下载配置环境变量HarmonyOS的环境变量配置配置Flutter的环境变量Flutter doctor -v 检测的问题flutter_flutter仓库地址的警告问题Fliutter doctor –v 报错[!] Android Studio (v…

构建数据分析模型,及时回传各系统监控监测数据进行分析反馈响应的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。增…

20 基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32F103C8T6 采用DHT11读取温度、滑动变阻器模拟读取电流、电压。 通过OLED屏幕显示&#xff0c;设置电流阈值为80&#xff0c;电流小阈值为50&#xff0c;电压阈值为60&#xff0c;温度阈值…

虚幻引擎的射线检测/射线追踪

射线检测在 FPS/TPS 游戏中被广泛应用 什么是射线检测? 两个点行成一条线 , 射线检测是从一个起始点发出一条到终点的射线 , 如果射线命中一个游戏对象&#xff0c;就可以获取到对象命中时的 位置、距离、角度、是否命中、骨骼 等非常多的信息 , 这些信息在射击游戏中至关重…

价格便宜又好用的云电脑挑选:ToDesk云电脑 vs 青椒云

云计算技术的成熟使得云电脑因其便捷、灵活和高效而成为日常工作、学习和娱乐的首选工具。而在众多云电脑品牌之中&#xff0c;ToDesk云电脑与青椒云电脑 较为热门 。在此&#xff0c;笔者将围绕价格、性能、用户体验等关键指标对 比 这两款云电脑&#xff0c; 帮助 你们 找到最…

信号分解降噪 | Matlab实现基于TVFEMD-IMF能量熵增量的数据降噪方法

信号分解降噪 | Matlab实现基于TVFEMD-IMF能量熵增量的数据降噪方法 目录 信号分解降噪 | Matlab实现基于TVFEMD-IMF能量熵增量的数据降噪方法效果一览基本介绍程序设计参考资料 效果一览 基本介绍 信号分解降噪 | Matlab实现基于TVFEMD-IMF能量熵增量的数据降噪方法。该方法引…

地平线静态目标检测 MapTR 参考算法-V1.0

简介 高清地图是自动驾驶系统的重要组件&#xff0c;提供精确的驾驶环境信息和道路语义信息。传统离线地图构建方法成本高&#xff0c;维护复杂&#xff0c;使得依赖车载传感器的实时感知建图成为新趋势。早期实时建图方法存在局限性&#xff0c;如处理复杂地图元素的能力不足…

【python】requests 库 源码解读、参数解读

文章目录 一、基础知识二、Requests库详解2.1 requests 库源码简要解读2.2 参数解读2.3 处理响应2.4 错误处理 一、基础知识 以前写过2篇文章&#xff1a; 计算机网络基础&#xff1a; 【socket】从计算机网络基础到socket编程——Windows && Linux C语言 Python实现…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【LMS调测】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 LMS全称为Lite Memory Sanitizer&#xff0c;是一种实时…

新版本大疆上云API指令飞行(drc)模式通讯搭建思路

一、大疆上云API mqtt官方通讯指导 1.1drc链路 1.2mqtt交互时序图 二、自行搭建mqtt说明 2.1工具&#xff1a;用emqx搭建mqtt服务器&#xff0c;mqttx作为客户端测试工具 2.2端口说明&#xff1a;1883&#xff0c;普通mqtt消息端口&#xff0c;8083&#xff0c;ws通信协议端…

商业银行应用安全架构设计实践

传统的信息安全工作通常偏向于事中或事后检测漏洞,随着敏捷开发工作的逐步推进,商业银行认识到安全架构设计在实现IT降本增效方面的独特优势。近几年,商业银行逐步构建了安全架构设计工作体系,在组织人员、安全技术与管控流程方面,与企业IT架构密切协同,着力建设安全公共…

课程表-LeetCode100

现在你总共有 numCourses 门课需要选&#xff0c;记为 0 到 numCourses - 1。给你一个数组 prerequisites &#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示在选修课程 ai 前 必须 先选修 bi 。 例如&#xff0c;想要学习课程 0 &#xff0c;你需要先完成课程 1…

Python | Leetcode Python题解之第432题全O(1)的数据结构

题目&#xff1a; 题解&#xff1a; class Node:def __init__(self, key"", count0):self.prev Noneself.next Noneself.keys {key}self.count countdef insert(self, node: Node) -> Node: # 在 self 后插入 nodenode.prev selfnode.next self.nextnode.…

【机器学习】——支持向量机

文章目录 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;概述SVM 的工作原理线性不可分数据&#xff1a;软间隔与核技巧SVM 的数学形式SVM 的优势SVM 的缺点SVM 的应用 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;概述 支持向量机&#…

JavaSE高级(3)——lombok、juint单元测试、断言

一、lombok的使用 默认jvm不解析第三方注解&#xff0c;需要手动开启 链式调用 二、juint单元测试 下载juint包 public class TestDemo {// 在每一个单元测试方法执行之前执行Beforepublic void before() {// 例如可以在before部分创建IO流System.out.println("befor…

荣耀手机AI搜索革新体验:一键总结归纳,让信息获取更高效

在信息爆炸的时代&#xff0c;我们每天都被海量的数据包围&#xff0c;如何快速、准确地获取所需信息成为了现代人的一大挑战。 近日&#xff0c;荣耀手机宣布其AI搜索功能正式上线&#xff0c;这一创新举措不仅为使用者带来了前所未有的便捷体验&#xff0c;更在智能手机领域…

栈:只允许在一端进行插入或删除操作的线性表

一、重要术语&#xff1a; 栈顶、栈底、空栈 二、线性表的基本操作 三、栈的相关操作&#xff1a; 把线性表中的list改成stack insert改成 push delete 改成 pop 总结&#xff1a;“后进先出” 四、顺序栈&#xff1a; 缺点&#xff1a;栈的大小不可变 1.定义&#xff1a; …

生物反馈治疗仪——精神患者治疗方案

生物反馈治疗仪标准型由治疗仪主机、专用软件、电极帽&#xff08;含脑电放大器、电极线&#xff09;套装、电源适配器与显示器配套使用&#xff0c;终身免费软件升级。 与显示配套使用&#xff0c;对儿童多动症有辅助治疗作用。建议每周训练2&#xff5e;3次&#xff0c;每次训…