NoSQL数据库原理与应用综合项目——Neo4j篇

news2024/11/20 14:33:49

NoSQL数据库原理与应用综合项目——Neo4j篇

文章目录

  • NoSQL数据库原理与应用综合项目——Neo4j篇
    • 0、 写在前面
    • 1、本地数据或HDFS数据导入到Neo4j
    • 2、Neo4j数据库表操作
      • 2.1 使用Python连接Neo4j
      • 2.2 查询数据
      • 2.3 插入数据
      • 2.4 修改数据
      • 2.5 删除数据
    • 3、Windows远程连接Neo4j(Linux)
    • 4、数据及源代码
    • 5、总结


在这里插入图片描述


0、 写在前面

  • Windos版本:Windows10
  • Linux版本:Ubuntu Kylin 16.04
  • JDK版本:Java8
  • Hadoop版本:Hadoop-2.7.1
  • HBase版本:HBase-1.1.5
  • Zookeepr版本:使用HBase自带的ZK
  • Redis版本:Redis-3.2.7
  • MongoDB版本:MongoDB-3.2.7
  • Neo4j版本:Neo4j-3.5.12 Community
  • IDE:IDEA 2020.2.3
  • IDE:Pycharm 2021.1.3

节点与节点的关系

  • author-[own]-name
  • name-[has]-dicount
  • name-[belongto]-type

分别代表:

  • 作者拥有(own)书籍;
  • 书籍具有(has)折扣;
  • 书籍属于(belongto)某种类型

1、本地数据或HDFS数据导入到Neo4j

注:选取前200条数据

  • 代码:

为了更好地展示节点与节点之间的关系,特意将每条数据拆分为两个节点存储。前5个字段作为标签books1的节点,后5个字段作为标签books2的另一节点。

USING PERIODIC COMMIT 200 LOAD CSV FROM 'file:///tb_books.csv' AS line
merge (b1:books1{id:line[0],type:line[1],name:line[2],author:line[3],
price:line[4]})
merge (b2:books2{id:line[0],discount:line[5],pub_time:line[6], pricing:line[7], 
publisher:line[8],crawler_time:line[9]})

批量数据导入Neo4j可以参考以下链接:

http://t.csdn.cn/ORTtv

  • 运行成功图示:

顺利插入200条数据,一共400个节点

图片

  • 结果图:

可以看到book1和books2标签拥有相同量的数据

图片

2、Neo4j数据库表操作

2.1 使用Python连接Neo4j

  • 代码:

连接Neo4j数据库输入地址、用户名、密码

url = 'bolt://10.125.0.15:7687'
usr = 'neo4j'
key = '123456'
graph = Graph(url, auth=(usr, key))
matcher = NodeMatcher(graph)  # 创建节点匹配器

2.2 查询数据

  • 根据ID查找节点

将参数label和ID传入queryById()

# 1. 查找节点id/根据id查找节点
def queryById(label, ID) :
    print('所有的节点类型为:', graph.schema.node_labels)  # 查看节点类型
    res = list(matcher.match(label, id = ID))
    print(res)

在这里插入图片描述

  • 按照属性排序查找Top5节点

将参数label和fieldName传入querySortingByField(),其中使用辅助函数来限制条件

def querySortingByField(label, fieldName) :
    pre = list(matcher.match(label))
    if pre.__eq__(list()):
        print('The label what you query is not exists!')
    else :
        res = querySortingByFieldHelper(label, fieldName)
        if res is not None :
            print(res)

辅助函数querySortingByFieldHelper()

def querySortingByFieldHelper(label, fieldName) :
    flag = True
    if fieldName.__eq__('id'):
        res = list(matcher.match(label).order_by('_.id').limit(5))
    elif fieldName.__eq__('type'):
        res = list(matcher.match(label).order_by('_.type').limit(5))
    elif fieldName.__eq__('name'):
        res = list(matcher.match(label).order_by('_.name').limit(5))
    elif fieldName.__eq__('author'):
        res = list(matcher.match(label).order_by('_.author').limit(5))
    elif fieldName.__eq__('price'):
        res = list(matcher.match(label).order_by('_.price').limit(5))
    elif fieldName.__eq__('discount'):
        res = list(matcher.match(label).order_by('_.discount').limit(5))
    elif fieldName.__eq__('pub_time'):
        res = list(matcher.match(label).order_by('_.pub_time').limit(5))
    elif fieldName.__eq__('pricing'):
        res = list(matcher.match(label).order_by('_.pricing').limit(5))
    elif fieldName.__eq__('publisher'):
        res = list(matcher.match(label).order_by('_.publisher').limit(5))
    elif fieldName.__eq__('crawler_time'):
        res = list(matcher.match(label).order_by('_.crawler_time').limit(5))
    else:
        flag = False
    if flag :
        return res
    else :
        print('不存在这个属性!')

图片

  • 查找关系

要查询的关系名rsName作为参数传入queryRelationship()

# TODO 查关系,找到所有关系
def queryRelationship(rsName) :
    all_r_types = list(graph.schema.relationship_types)
    all = list(graph.match(nodes=None, r_type=None, limit=None))

    flag = True
    if rsName.__eq__('own') :
        print('你所查询的关系【' + rsName + '】结果为:')
        one = list(graph.match(nodes=None, r_type = 'own'))
    elif rsName.__eq__('has') :
        print('你所查询的关系【' + rsName + '】结果为:')
        one = list(graph.match(nodes=None, r_type = 'has'))
    elif rsName.__eq__('belongto') :
        print('你所查询的关系【' + rsName + '】结果为:')
        one = list(graph.match(nodes=None, r_type = 'belongto'))
    else :
        flag = False
        print('你所查询的关系【' + rsName + '】不存在!')

    if flag :
        print(one)

图片

2.3 插入数据

  • 新增节点

要插入的节点信息以数组的形式作为参数传入addNode()

Note:新增的数据依旧是拆分为2部分,创建两个节点

## TODO 增加节点
def addNode(arr) :
    # TODO 创建节点
    node1 = Node(arr[10], id = arr[0], type = arr[1], name = arr[2],
                author = arr[3], price = arr[4])
    node2 = Node(arr[10], id = arr[0], discount=arr[5],pub_time=arr[6], pricing=arr[7],
                 publisher=arr[8],crawler_time=arr[9])
    graph.create(node1)
    graph.create(node2)
    print('Add node successfully!')

图片

  • 为节点增加关系

要插入的节点信息以数组的形式作为参数传入addNode()

Note:此处为节点间新增关系,关系名称设置为节点的ID号+“_”+关系名(own、has、belongto)

## TODO 增加关系
def addRelationShip(label1, label2, ID) :
    # TODO 创建关系(已有节点)
    matchList1 = list(matcher.match(label1, id = ID))
    matchList2 = list(matcher.match(label2, id = ID))

    rLabel1 = matchList1[0]['id'] + "_own"
    fromNode1 = Node(rLabel1, author = matchList1[0]['author'])
    toNode1 = Node(rLabel1, name = matchList1[0]['name'])
    own_relation = Relationship(fromNode1, "own", toNode1)

    rLabel2 = matchList1[0]['id'] + "_has"
    fromNode2 = Node(rLabel2, name=matchList1[0]['name'])
    if label2.__contains__('insert') :
        toNode2 = Node(rLabel2, discount=matchList2[1]['discount'])
    else :
        toNode2 = Node(rLabel2, discount=matchList2[0]['discount'])
    has_relation = Relationship(fromNode2, "has", toNode2)

    rLabel3 = matchList1[0]['id'] + "_belongto"
    fromNode3 = Node(rLabel3, name=matchList1[0]['name'])
    toNode3 = Node(rLabel3, type=matchList1[0]['type'])
    belongto_relation = Relationship(fromNode3, "belongto", toNode3)

    # 将创建关系传递到图上
    total_rs = own_relation | has_relation | belongto_relation
    graph.create(total_rs)

    print("Add relation{own,has,belongto} successfully!")

图片

2.4 修改数据

  • 修改指定属性name值

要修改的条件label, ID, fieldName, newValue作为参数传入updateFieldVal()

Note:此处使用CQL语句来实现修改属性值,graph.run(uCQL)执行修改操作

def updateFieldVal(label, ID, fieldName, newValue):
    # TODO 修改属性值
    uCQL = 'match(b:' + label +  ') where b.id = ' + "\'" + ID + "\'"  + ' set b.' + fieldName + '=' + \
           "\'" + newValue + "\'" + ' return b'
    print(uCQL)
    try :
        graph.run(uCQL)
        print('update sucessfully!')
    except Exception :
        print('Happen Exception!')

图片

在这里插入图片描述

2.5 删除数据

  • 根据ID删除一个节点

要删除的条件label,id值作为参数传入deleteOneNodeById()

# 2. 根据ID删除一个节点(不能删除含有关系的节点)
def deleteOneNodeById(label, fieldValue) :
    node = matcher.match(label).where(id = fieldValue).first()  # 先匹配,叫fieldValue的第一个结点
    graph.delete(node)
    print('标签为' + label + ', id为' + fieldValue + '的一个节点成功删除!')

tp

  • 删除指定关系

要删除的条件label和rsName作为参数传入deleteRelationship()

Note:此处也是使用CQL语句实现的,graph.run(deleteCQL1)执行删除关系的操作

# 3. 删除关系
def deleteRelationship(label, rsName) :
    deleteCQL1 = 'match(n:' + "`" + label + "`" + ')-[r:' + rsName + ']-() delete r'
    print(deleteCQL1)
    try :
        graph.run(deleteCQL1)
        print('delete label[' + label + '],' + 'relationship[' +  rsName + '] successufully!')
    except Exception:
        print('Happen Exception')

删除前数据:

tp

删除后数据:

tp

3、Windows远程连接Neo4j(Linux)

Neo4j的相关配置文件需要提前设置正确,最主要的就是ip地址,同时要注意防火墙是否关闭。

4、数据及源代码

  • Github

  • Gitee

5、总结

由于数据量有1万多条,将数据一次性全部导入Neo4j速度较慢,所以只是抽取200条数据进行导入,加速导入的速度。

结束!

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

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

相关文章

uboot源码下载以及编译

环境:ubuntu 20.04 uboot源码下载以及编译1 uboot源码下载:1.1 进入uboot官网1.2 下载源码2 编译uboot2.1 配置2.2 编译2.2.1 确认编译工具链是否ok2.2.2 配置环境变量2.2.3 编译3 注意事项3.1 uboot 2022.04版本问题3.2 unable to execute swig: No suc…

分代收集算法

将这个堆内存划分成两块:新生代和老年代,刚刚创建的对象都在新生代,长久存活的对象都在老年代(老年代的垃圾回收很久发生一次,新生代的垃圾回收发生的比较频繁) 新生代又进一步划分成伊甸园Eden&#xff0…

docker安装gitlab(超级详细)

前提: 在操作之前需要安装docker和docker-compose 拉取镜像 docker pull gitlab/gitlab-ce:15.2.4-ce.0 创建本地文件夹 mkdir /data/docker/gitlab/etc mkdir /data/docker/gitlab/logs mkdir /data/docker/gitlab/data 编写 docker-compose.yml cd /data/docker/…

面试高频题目,每周更新。

1.如何实现一个div快速的居中对齐? 2.margin和padding有什么不同? 作用对象不同,margin是针对对外部对象,padding是针对于自身。 3.vw和百分比有什么区别? 百分比是有继承的,父级元素改变后,会…

删除的照片如何恢复? 5个照片恢复方法总结

有人说,照片承载着很多回忆,一些难忘的时刻,还有一些经历。这就是我们不能丢失它们的原因,如果偶然丢失它们,到目前为止还没有可靠的设备。但是,如果您丢失了一些照片并想找回它们,请不要担心&a…

MySQL集群解决方案(4):负载均衡

在前面架构中,虽然对mycat做了集群,保障了mycat的可靠性,但是,应用程序需要连接到多个mycat,显然不是很友好的,也就是说缺少负载均衡的组件,接下来我们来了解下HAProxy。 1 简介 官网&#xff…

Nacos安装-单机安装

目录 一、环境介绍 二、安装方式 三、部署模式 四、单机模式包部署 4.1 下载到对应地址 4.2 解压缩包 4.3 单机模式支持mysql 导入初始化SQL 修改配置文件 4.4. 单机模式启动nacos 启动成功 登录 一、环境介绍 操作系统:Ubuntu 20.04.1JDK:保证…

HaaS EDU物联网项目实战:老板来了

HaaS EDU K1是一款高颜值、高性能、高集成度的物联网开发板,板载功能强大的4核(双核300Mhz M33双核1GHz A7)主芯片,2.4G/5G双频Wi-Fi,双模蓝牙(经典蓝牙/BLE),并自带丰富的传感器与小…

2023 年的 7 个技术趋势——人工智能与企业内容管理相结合,云成为企业 IT 标准, 数据民主化······

2023 年的 7 个技术趋势 技术的发展速度比以往任何时候都快。高通胀、供应链问题和技术工人短缺等经济因素给当今的企业带来了巨大的压力。艰难的经济环境促使公司重新评估其财务战略,并寻找保持利润率的方法,同时培养对不断变化的经济状况做出快速反应…

又一款AR HUD前装量产上车!这家供应商深耕HUD行业8年

12月15日晚,岚图汽车首款轿车——岚图追光正式首发亮相并开启预售。预售价分别为32.29万元、35.29万元、43.29万元。 作为岚图汽车首个搭载ESSASOA智能电动仿生体的量产车型,领先的技术架构保证岚图追光在性能、智能、豪华、安全等各维度的表现都达到同级…

【数据结构-排序】内部排序

文章目录1 直接插入排序1.1 算法简要思想1.2 算法特性2 希尔排序2.1 算法简要思想2.2 手动模拟2.3 算法特性3 冒泡排序3.1 算法简要思想3.2 算法特性4 快速排序4.1 算法思路4.2 算法代码4.3 手动模拟4.4 算法特性4.5 相关例题5 简单选择排序5.1 算法简要思想5.2 算法特性6 堆排…

了解网络保险以及为什么它对您的业务很重要

本文,我们将探讨网络保险,它如何在发生网络攻击时帮助企业,以及为什么您的企业组织需要它。 大流行后的工作场所在很大程度上转向远程优先或混合安排,员工使用各种个人设备连接到公司网络。不良的网络卫生实践、缺乏足够的网络安全…

IDEA懒人必备插件:自动生成单元测试,太爽了!

今天,我们将介绍一个工具Squaretest,它是一个用于自动生成单元测试的插件。它也将被使用,因为该公司最近实施了代码质量控制指标,以评估各种项目的单元测试覆盖率和声纳扫描的各种问题。 许多旧项目和旧代码,或者需要匆…

ArcGIS基础:在线数据上生成规则采样点

需求:在线要素上等间距生成一定数量的采样点或者在线数据上随机生成一系列的采样点 原始数据如下所示,为一个普通的线数据,以下操作是在此线数据上生成一定数量的采样点。 注意:切记,点要素和线要素数据都要为shp格式…

飞桨生态之FastDeploy预编译库的使用方法

飞桨生态之FastDeploy预编译库的使用方法1 FastDeploy2 下载FastDeploy编译demo方法1 FastDeploy 为什么采用FastDeploy,由于之前使用PaddleOCR(paddlle_inference)框架的代码做推理,造成实际显存一直开辟,不释放我的问题,刚开始两个模型占用…

vxlan转发原理

openstack neutron组件也用到了vxlan,还有dvr,在云计算环境到底分布式网关好还是集中式网关好,vxlan对称还是非对称转发好,什么样的控制平面好,要对这些问题得出结论不管怎样先得深刻理解vxlan转发流程。 三层转发就是…

Java——继承——Extends

继承为什么要继承呢?继承的语法继承的概念子类中访问父类性质Java的单继承super和this子类构造方法protected中super的使用final关键字今天我们来说说面向对象的又一特征:继承!为什么要继承呢? class Dog{public String name;pub…

QT Qmake 笔记

文章目录概述QT修改样式qmake概述库引用和库路径指定QT创建动态库和使用小例子写动态库用动态库参考资料附录概述 需要先安装osg,然后再编译安装osgQOpenGL的插件。 其中,osgQOpenGL是OSG嵌入到qt中的一种实现方式,换言之,能够支…

【小学信息技术教资面试】《认识鼠标》教案

1.题目:认识鼠标 2.内容: 3.基本要求: (1)掌握鼠标的基本操作 (2)体现学生的主体地位 (3)多种教学方法结合使用 (4)配合板书讲解 《认识鼠标》…

C语言学习之路(高级篇)—— 变量和内存分布(下)

说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 程序的内存分区模型 1) 内存分区 1.1 运行之前 我们要想执行我们编写的c程序,那么第一步需要对这个程序进行编译。 预处理&#xf…