知识图谱-Neo4j使用详解

news2024/12/23 7:00:34

neo4j应用场景

  1. 知识图谱
  2. 欺诈检测
  3. 实时推荐引擎
  4. 反洗钱
  5. 主数据管理
  6. 供应链管理
  7. 增强网络和IT运营管理能力
  8. 数据谱系
  9. 身份和访问管理
  10. 材料清单

图数据库neo4j简介

在这里插入图片描述

关系查询:mysql和neo4j性能对比

在这里插入图片描述

neo4j的特性和优点:

在这里插入图片描述

Neo4j-CQL简介

neo4j的Cypher语言是为处理图形数据而构建的,CQL代表Cypher的查询语言,像oracle数据库具有查询语言SQL
在这里插入图片描述

常用命令

1. 同时创建节点和关系

   create (n1:class {name:"英语1"})-[r:BASIC]->(n2:class2 {name:"英语2"})

2. 批量删除节点

   with [42,43,44,45] as nodeIds unwind nodeIds as nodeId match (n) where id(n) = nodeId delete n

3. 删除当前节点下的所有关系(删除节点前必须做此操作)

   match (n)-[r]-() where id(n)=46 delete r

4. 为已经存在的节点创建关系

   match (a:class {name:"英语1"}),(b:class2 {name:"英语2"}) create (a)-[r:BASIC]->(b)

5. 删除当前节点下的指定关系(根据关系id删除)

   match (n)-[r]-() where id(n)=46 and id(r)=0 delete r

6. 根据关系id删除关系

   match (n)-[r]-() where id(r)=1 delete r

7. 删除全部节点和关系

   match (n) detach delete n

8. 创建关系时,给关系增加属性

   match (n1 {name:"大学英语III"}), (n2 {name:"大学英语IV"}) create (n1)-[r:BASIC {since: 2023}]->(n2)

9. 根据标签查找当前节点以及它的关系节点

   match (n:profession {name:"计算机专业"})-[r]->(n2) return n,n2

10. 根据关系名称查找:当前节点往后走的整个链条(递归调用)

    方法1:match path = (n {name:"大学英语II"})-[r:BASIC*]->() return nodes(path)
    方法2:match path = (n)-[r:BASIC*]->() where n.name="大学英语II" return nodes(path)

11. 根据关系名称查找:当前节点有关系的整个链条

    match path = (n)-[r:BASIC*]-() where n.name="大学英语III" return nodes(path)

12. 查看标签有多少个节点

    match (n:Person) return count(n) as person_count

13. 删除标签中的所有节点(同时自动删除它们的关系)

    match (n:Person) detach delete n

14. 创建一对节点(同时建立它们的联系)

    create (n1:Person{name:"张三"})-[r:couple{roles:"boyfriend"}]->(n2:Person{name:"rose"})

15. merge也可以创建两个节点之间的关系

    match (n:Person {name:"Shawn"}),(n2:Person {name:"Sally"}) merge (n)-[:FRIENDS {since:2023}]->(n2)

16. csv文件导入

load csv from "file:///test.csv" as line create (:Article {name:line[1], year: toInteger(line[2])})

17. 移除节点对应的标签

    match (n:Student {name:"李四"}) remove n:Student return n

18. 给已有节点添加标签

    match (n {name:"李四"}) set n:Person return n

19. 移除节点属性

    match (n:Person) where n.name="李四" remove n.age return n

20. 按照节点属性进行排序

    match (n:Student) return id(n) as id order by id asc

21. 其它命令

    * union: 拼接两个查询语句,不返回重复的行
    * union all: 拼接两个查询语句,返回重复的行
    * limit n: 选择前几行
    * skip n: 跳过前几行

22. 给已有节点添加属性

    match (n:Student) where n.name="张三" set n.age=18,n.sex="女" return n

23. null值查询

    match (n:Student) where n.sex is null return n

24. in查询

    match (n:Student) where n.name in ["张三", "小红"] return n

25. index索引

    * 创建索引

      create index on :Student (name)

    * 删除索引

      drop index on :Student (name)

26. unique约束

    * 创建唯一性约束

      create constraint on (n:Student) assert n.name is unique

    * 删除唯一性约束

      drop constraint on (n:Student) assert n.name is unique

常用函数

  1. 字符串函数
    在这里插入图片描述

  2. 聚合函数
    在这里插入图片描述

  3. 关系函数
    在这里插入图片描述

Neo4j-admin的使用

对neo4j数据进行备份、还原、迁移操作时,要关闭neo4j

  1. 数据库备份

    /home/neo4j/neo4j-community-3.5.2/bin/neo4j-admin dump --database=graph.db --to=/root/graph_back.dump
    
  2. 数据库恢复

    # 数据导入
    /home/neo4j/neo4j-community-3.5.2/bin/neo4j-admin load --from=/root/graph_back.dump --database=graph.db --force
    # 重启服务
    neo4j start
    

python操作neo4j

  1. 安装py2neo

    pip install py2neo==2020.1.0

  2. 创建图对象

    import time
    
    from py2neo import Graph
    
    graph = Graph("http://localhost:7474", username="neo4j", password="123456")
    print(graph)
    
  3. Node

    #获取key对应的property
    x=node[key] 
     #设置key键对应的value,如果value是None就移除这个property
    node[key] = value
     #也可以专门删除某个property
    del node[key]
    #返回node里面property的个数
    len(node)
    #返回所以和这个节点有关的label
    labels=node.labels
    #删除某个label
    node.labels.remove(labelname)
    #将node的所有property以dictionary的形式返回
    dict(node)
    
  4. Relationship
    #创建Relationship
    Relationship`(*start_node*, *type*, *end_node*, ***properties*)
    #返回Relationship的property
    Relationship[key]
    #删除某个property
    del Relationship[key]
    #将relationship的所有property以dictionary的形式返回
    dict(relationship)
    
  5. 创建一段关系链

    from py2neo import Graph, Node, Relationship
    
    g = Graph("http://localhost:7474", username="neo4j", password="123456")
    a = Node("Person", name="Alice")
    b = Node("Person", name="Bob")
    ab = Relationship(a, "KNOWS", b)
    g.create(ab)
    
  6. 数据准备

    from py2neo import Graph, Node, Relationship, Subgraph
    
    g = Graph("http://localhost:7474", username="neo4j", password="123456")
    
    tx = g.begin()
    
    jiazhen = Node("Person", name="陈家珍", age=66)
    fugui = Node("Person", name="徐富贵", age=67)
    youqian = Node("Person", name="徐有钱")
    renxing = Node("Person", name="徐任性")
    cat = Node("Person", name="cat")
    dog = Node("Person", name="dog")
    
    wife = Relationship(fugui, "WIFE", jiazhen)
    brother_1 = Relationship(fugui, "BROTHER", youqian)
    brother_2 = Relationship(fugui, "BROTHER", renxing)
    hus = Relationship(jiazhen, "HUS", fugui)
    know = Relationship(cat, "KNOWS", dog)
    
    relation_list = Subgraph(relationships=[wife, brother_1, brother_2, hus, know])
    tx.create(relation_list)
    tx.commit()
    
  7. query

    • 匹配所有节点

      from py2neo import Graph, Node, Relationship, Subgraph
      
      g = Graph("http://localhost:7474", username="neo4j", password="123456")
      
      nodes = g.nodes.match()
      for node in nodes:
          print(node)
          print(node.items())
          print(node.labels)
      
      
    • 匹配符合指定条件的节点

      from py2neo import Graph, Node, Relationship, NodeMatcher, Subgraph
      
      g = Graph("http://localhost:7474", username="neo4j", password="123456")
      
      # 用来查找节点对象
      matcher = NodeMatcher(g)
      # first返回第一个符合条件的节点
      node1 = matcher.match("Person", name="徐有钱").first()
      print(node1)
      print(node1["name"])
      # all返回所有符合条件的节点
      nodes = matcher.match("Person").all()
      for node in nodes:
          print(node, node["name"])
      # 按照节点的年龄属性查找
      nodes = matcher.match("Person", age=66).all()
      print("*" * 25 + "年龄66" + "*" * 25)
      for node in nodes:
          print(node["name"], node["age"])
      # 模糊匹配,要用Cypher
      nodes = matcher.match("Person").where("_.name =~ '徐.*'").all()
      print("*" * 25 + "姓徐的节点" + "*" * 25)
      for node in nodes:
          print(node["name"], node["age"])
      
    1. 更新

      • 更新要先找出nodes,在使用事务的push更新
      from py2neo import Graph, Node, Relationship, NodeMatcher, Subgraph
      
      g = Graph("http://localhost:7474", username="neo4j", password="123456")
      
      tx = g.begin()
      
      # 找到你要招的nodes
      matcher = NodeMatcher(g)
      
      # 修改单个节点
      """
      init_node = matcher.match("Person", name="徐富贵")
      new_node = init_node.first()
      new_node["name"] = "富贵"
      sub = Subgraph(nodes=[new_node])
      tx.push(sub)
      tx.commit()
      """
      
      # 修改多个节点
      init_node = matcher.match("Person")
      nodes = init_node.all()
      new_nodes = []
      for node in nodes:
          node["name"] = "哈哈-" + node["name"]
          new_nodes.append(node)
      sub = Subgraph(nodes=new_nodes)
      tx.push(sub)
      tx.commit()
      
      • 两个节点新加关系

        fugui = matcher.match("Person", name="富贵").first()
        youqian = matcher.match("Person", name="徐有钱").first()
        relation = Relationship(fugui, "Brother", youqian)
        g.create(relation)
        
    2. 删除

      • 删除关系链

        注意:删除关系时节点自动删除

        matcher = NodeMatcher(g)
        r_matcher = RelationshipMatcher(g)
        fugui = matcher.match("Person", name="富贵").first()
        youqian = matcher.match("Person", name="徐有钱").first()
        relation = r_matcher.match(nodes=[fugui, youqian]).first()  # 如果此处nodes里面写None,会匹配所有关系
        g.delete(relation)
        
    3. 只删除关系,不删除节点

      matcher = NodeMatcher(g)
      r_matcher = RelationshipMatcher(g)
      cat = matcher.match("Person", name="cat").first()
      dog = matcher.match("Person", name="dog").first()
      relation = r_matcher.match(nodes=[cat, dog]).first()
      g.separate(relation)
      
    4. 批处理

    对于大量的插入一般是很费时的,首先我们可以使用事务,加快一定速度,而插入的方法一样重要,我们很多时候是遍历一个文件然后生成图,例子中我们生成每个Node后,先把他们放入一个List中,再变为Subgraph实例,然后再create(),耗时比一条条插入至少快10倍以上

    • 创建多个节点
tx = g.begin()

node_list = [Node("Num", name=str(num+1)) for num in range(4)]
node_list = Subgraph(nodes=node_list)

tx.create(node_list)
tx.commit()
  • 删除所有关系

    tx = g.begin()
    
    r_matcher = RelationshipMatcher(g)
    relations = r_matcher.match().all()
    sub_list = Subgraph(relationships=relations)
    tx.separate(sub_list)  # 删除关系,不删除节点
    
    tx.commit()
    

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

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

相关文章

96.qt qml-http之XMLHttpRequest介绍详解使用

在QML中我们可以通过XMLHttpRequest 来实现http/https访问网络接口,接下来我们先来学习XMLHttpRequest类的常用部分、 由于QML的XMLHttpRequest少部分参数是没有的,所以本章来单独讲解下。下章我们来实现旋转请求按钮以及通用的JSON请求模板方法 1.XMLHttpRequest初步使用 …

计算机网络(六):应用层

参考引用 计算机网络微课堂-湖科大教书匠计算机网络(第7版)-谢希仁 1. 应用层概述 应用层是计算机网络体系结构的最顶层,是设计和建立计算机网络的最终目的,也是计算机网络中发展最快的部分 早期基于文本的应用 (电子邮件、远程登…

Boost程序库完全开发指南:1.1-C++基础知识点梳理

主要整理了N多年前(2010年)学习C的时候开始总结的知识点,好长时间不写C代码了,现在LLM量化和推理需要重新学习C编程,看来出来混迟早要还的。 1.shared_ptr 解析:shared_ptr是一种计数指针,当引…

【Linux】【网络】工具:httplib 库的安装与简单使用

文章目录 1. 下载 httplib 库2. 从 Win 传输文件到 Linux3. 解压缩 httplib 库1. struct Request 结构体源码展示2. struct Reponse 结构体源码展示3. httplib 库 Server 类4. httplib 库 Client 类5. 搭建简易 server 服务器6. 搭建简易 client 客户端 1. 下载 httplib 库 要求…

结构体和联合体

目录 一.结构体 1.1什么是结构体? 1.2结构的声明 1.3特殊声明 1.4结构的自引用 1.5 结构体变量的定义和初始化 1.6 结构体内存对齐 1.7修改默认对齐数 二.联合体 2.1联合类型的定义 2.2联合的特点 2.3联合大小的计算 一.结构体 1.1什么是结构体&#xf…

【milkv】max98357a驱动添加speaker

文章目录 一、电路1.1 duo音频接口1.2 I2S2连接 二、I2S2介绍2.1 参考cv182x的dts实现2.2 参考cv1835_fpga2.3 cv180x2.4 改动——保留i2s2.5 I2S小结 三、参考资料3.1 文章3.2 手册 四、驱动路径五、添加codec驱动——max98357a5.1 config5.2 dtsi5.3 dai_driver 六、查看plat…

VUE3照本宣科——内置指令与自定义指令及插槽

VUE3照本宣科——内置指令与自定义指令及插槽 前言一、内置指令1.v-text2.v-html3.v-show4.v-if5.v-else6.v-else-if7.v-for8.v-on9.v-bind10.v-model11.v-slot12.v-pre13.v-once14.v-memo15.v-cloak 二、自定义指令三、插槽1.v-slot2.useSlots3.defineSlots() 前言 &#x1f…

Chrome之解决DevTools: Failed to load data:No resource with given identifier found

问题 使用DevTools抓包时候, 有些跨域请求无法在加载出来, 提示 Failed to load data:No resource with given identifier found 解决办法 换其他浏览器 下断点 打开DevTools, 选择源代码/来源/Sources,找到事件监听器断点/Event Listener Breakpoints, 找到加载/Load下面…

C++树详解

树 树的定义 树(Tree)是n(n≥0)个结点的有限集。n0时称为空树。在任意一颗非空树中:①有且仅有一个特定的称为根(Root)的结点;②当n>1时,其余结点可分为m&#xff08…

十天学完基础数据结构-第七天(图(Graph))

图的基本概念 图是一种数据结构,用于表示对象之间的关系。它由两个基本组件构成: 顶点(Vertex):也被称为节点,代表图中的对象或实体。 边(Edge):连接两个顶点的线&…

【setxattr+userfaultfd】SECCON2020-kstack

这个题主要还是练习 userfaultfd 的利用。说实话,userfaultfd 的利用还是挺多的,虽然在新的内核版本已经做了相关保护。 老规矩,看下启动脚本 #!/bin/sh qemu-system-x86_64 \-m 128M \-kernel ./bzImage \-initrd ./rootfs.cpio \-append …

第三章、运输层

文章目录 3.1 概述和运输层服务3.1.1 运输层和网络层的关系3.1.2 因特网运输层概述 3.2 多路复用与多路分解3.3 无连接运输:UDP3.4 可靠数据传输原理3.4.1构造可靠数据传输协议rdt1.0rdt2.xrdt3.0 3.4.2 流水线可靠数据传输协议3.4.3 回退N步3.4.4选择重传 3.5 面向…

x64内核实验1-调试环境配置

x64内核实验1-调试环境配置 这是一套x64内核实验的课程,我之前学习32位内核的时候就是在网上找的各种教程当学完32位很久之后发现在网上的64位内核相关的完整教程真的很少,所以就想着不如自己写一点方便对内核有兴趣的人能更好的入门,首先声…

哈希原理和解决哈希冲突方法

第一 哈希介绍 哈希和红黑树是我早期就听过的名词,却一直没见到真面目,实现哈希后才发现原来我早就使用过了哈希。看下面例题。 用map和set都可以轻松解决,但是在我写这题时我还不会用map和set,我用了另一种方法。看下面代码。先定…

【Java】微服务——Nacos配置管理(统一配置管理热更新配置共享Nacos集群搭建)

目录 1.统一配置管理1.1.在nacos中添加配置文件1.2.从微服务拉取配置1.3总结 2.配置热更新2.1.方式一2.2.方式二2.3总结 3.配置共享1)添加一个环境共享配置2)在user-service中读取共享配置3)运行两个UserApplication,使用不同的pr…

Office Tool Plus下载与神龙版官网下载

文章目录 一、Office Tool Plus下载二、神龙下载 Office Tool Plus简称OTP,是一款专业的Office官方镜像下载器,可以下载安装Word、Excel、Visio等。神龙用于快速激活使用。 注意:Win7系统必须要SP1或更高版本才能使用,Office Tool…

intel 一些偏门汇编指令总结

intel 汇编手册下载链接:https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html LDS指令: 手册中可以找到 位于 3-588 根据手册内容猜测:lds r16 m16:16 的作用,是把位于 [m16:16] 内存地址的数…

JMeter的详细使用及相关问题

一、中文乱码问题 如果出现乱码,需要修改编码集,(版本问题有的不需要修改,就不用管) 修改后保存重启就好了。 JMeter5.5版本的按照如下修改: 二、JMeter的启动 ①建议直接用ApacheJMeter.jar双击启动…

Zabbix4自定义脚本监控MySQL数据库

一、MySQL数据库配置 1.1 创建Mysql数据库用户 [rootmysql ~]# mysql -uroot -p create user zabbix127.0.0.1 identified by 123456; flush privileges; 1.2 添加用户密码到mysql client的配置文件中 [rootmysql ~]# vim /etc/my.cnf.d/client.cnf [client] host127.0.0.1 u…

CSDN博主粉丝数突破10万:坚持分享的力量与收获

今天,我在CSDN上看到了一位好友的统计数据,他统计了CSDN上所有粉丝数量排名靠前的博主的排名。虽然这个统计可能存在一些误差,但大体上应该是准确的。我惊讶地发现,截止到2023年10月4日,我的粉丝数量已经达到了101,376…