知识图谱-Neo4j使用详解

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 n3. 删除当前节点下的所有关系(删除节点前必须做此操作)match (n)-[r]-() where id(n)=46 delete r4. 为已经存在的节点创建关系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 r6. 根据关系id删除关系match (n)-[r]-() where id(r)=1 delete r7. 删除全部节点和关系match (n) detach delete n8. 创建关系时,给关系增加属性match (n1 {name:"大学英语III"}), (n2 {name:"大学英语IV"}) create (n1)-[r:BASIC {since: 2023}]->(n2)9. 根据标签查找当前节点以及它的关系节点match (n:profession {name:"计算机专业"})-[r]->(n2) return n,n210. 根据关系名称查找:当前节点往后走的整个链条(递归调用)方法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_count13. 删除标签中的所有节点(同时自动删除它们的关系)match (n:Person) detach delete n14. 创建一对节点(同时建立它们的联系)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 n18. 给已有节点添加标签match (n {name:"李四"}) set n:Person return n19. 移除节点属性match (n:Person) where n.name="李四" remove n.age return n20. 按照节点属性进行排序match (n:Student) return id(n) as id order by id asc21. 其它命令* union: 拼接两个查询语句,不返回重复的行* union all: 拼接两个查询语句,返回重复的行* limit n: 选择前几行* skip n: 跳过前几行22. 给已有节点添加属性match (n:Student) where n.name="张三" set n.age=18,n.sex="女" return n23. null值查询match (n:Student) where n.sex is null return n24. in查询match (n:Student) where n.name in ["张三", "小红"] return n25. 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 timefrom py2neo import Graphgraph = 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, Relationshipg = 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, Subgraphg = 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, Subgraphg = 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, Subgraphg = 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, Subgraphg = 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.hqwc.cn/news/124278.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能合约漏洞,Dyna 事件分析

智能合约漏洞,Dyna 事件分析 1. 漏洞简介 https://twitter.com/BlockSecTeam/status/1628319536117153794 https://twitter.com/BeosinAlert/status/1628301635834486784 2. 相关地址或交易 攻击交易 1: https://bscscan.com/tx/0x7fa89d869fd1b89e…

Hadoop启动后jps发现没有DateNode解决办法

多次使用 Hadoop namenode -format 格式化节点后DateNode丢失 找到hadoop配置文件core-site.xml查找tmp路径 进入该路径,使用rm -rf data删除data文件 再次使用Hadoop namenode -format 格式化后jps后出现DateNode节点

【Java 进阶篇】MySQL启动与关闭、目录结构以及 SQL 相关概念

MySQL 服务启动与关闭 MySQL是一个常用的关系型数据库管理系统,通过启动和关闭MySQL服务,可以控制数据库的运行状态。本节将介绍如何在Windows和Linux系统上启动和关闭MySQL服务。 在Windows上启动和关闭MySQL服务 启动MySQL服务 在Windows上&#x…

java使用数据库连接池

我的jar包名字 这些包都可以去搜索,有很多小伙伴会用网盘给我们.导入jar包就是复制然后粘贴就好了

论文笔记(整理):轨迹相似度顶会论文中使用的数据集

0 汇总 数据类型数据名称数据处理出租车数据波尔图 原始数据:2013年7月到2014年6月,170万条数据 ICDE 2023 Contrastive Trajectory Similarity Learning with Dual-Feature Attention 过滤位于城市(或国家)区域之外的轨迹 过…

Transformer学习-self-attention

这里写自定义目录标题 Self-attentionMulti-head self-attention用self-attention解决其他问题 Self-attention 用Wq、Wk、Wv分别乘输入向量得到q、k、v向量 用每个q向量乘所有的k向量得到对应项的attention,即用每项的query向量去匹配所有的key向量,得…

python模拟表格任意输入位置

在表格里输入数值,要任意位置,我找到了好方法: input输入 1. 行 2. 列输入:1 excel每行输入文字input输入位置 3.2 表示输入位置在:3行个列是要实现一个类似于 Excel 表格的输入功能,并且希望能够指定输入…

基于Java的水果生鲜购物网站设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

【Spring】Bean作用域和生命周期

Bean作用域和生命周期 一. Bean 的作用域1. Bean 的 6 种作⽤域:①. singleton②. prototype③. request④. session⑤. application⑥. websocket单例作用域(singleton) VS 全局作⽤域(application) 2. 设置作用域 二. Spring 执行流程和 Bean 的生命周期1. Spring…

机器人入门(一)

机器人入门(一) 一、ROS是什么,能用来干什么?二、哪些机器人用到了ROS?三、ROS和操作系统是绑定的吗?四、ROS 1 和ROS 2的关系是什么?4.1架构中间件改变API改变数据格式改变 4.2特性4.3工具/生态…

Flutter项目安装到Android手机一直显示在assembledebug

问题 Flutter项目安装到Android手机一直显示在assembledebug 原因 网络不好,gradle依赖下载不下来 解决方案 修改如下的文件 gradle-wrapper.properties 使用腾讯提供的gradle镜像下载 distributionUrlhttps://mirrors.cloud.tencent.com/gradle/gradle-7.5…

flink处理函数--副输出功能

背景 在flink中,如果你想要访问记录的处理时间或者事件时间,注册定时器,或者是将记录输出到多个输出流中,你都需要处理函数的帮助,本文就来通过一个例子来讲解下副输出 副输出 本文还是基于streaming-with-flink这本…