图和Neo4j

2023-11-07

文章来源:拉勾教育Java高薪训练营第3期,程道老师

1、图论

1.1、图论的起源-柯尼斯堡(Konigsberg)七桥问题

图论起源于一个非常经典的问题 —— 柯尼斯堡( Konigsberg )七桥问题。 1738 年,瑞典数
学家欧拉 ( Leornhard Euler) 解决了柯尼斯堡七桥问题。由此图论诞生,欧拉也成为图论的创始人。

欧拉把问题的实质归于 " 一笔画 " 问题,即判断一个图是否能够遍历完所有的边 (Edge) 而没有重复,而柯
尼斯堡七桥问题则是一笔画问题的一个具体情境。欧拉证明这个问题不成立。
 
满足一笔画的图满足两个条件 :
 
  1. 图必须是一个完整图
  2. 有零个或二个奇数点

1.2、图 和 节点

图是一组节点和连接这些节点的关系组成。图形数据存储在节点和关系所在的属性上。属性是键值对表
示的数据。
 
在图形理论中,我们可以使用圆表示一个节点 并且可以向里面添加键值对形式的数据。
 

1.3、节点关系表达

简单关系表达

此处在两个节点之间创建关系名称 跟随 。 这意味着 Profifile1 跟随 Profifile2
 
复杂关系表达

这里节点用关系连接。 关系是单向或双向的。
  • XYZPQR的关系是单向关系。
  • ABCXYZ的关系是双向关系。

​​​​​​1.​4、属性图模型规则

  • 图表示节点,关系和属性中的数据
  • 节点和关系都包含属性
  • 关系连接节点
  • 属性是键值对
  • 节点用圆圈表示,关系用方向键表示。
  • 关系具有方向:单向和双向。
  • 每个关系包含开始节点从节点到节点结束节点

2、知识图谱和图库

2.1 知识图谱

一种基于图的数据结构,由节点 (Node) 和边 (Edge) 组成。其中节点即实体,由一个全局唯一的 ID 标示,
边就是关系用于连接两个节点。通俗地讲,知识图谱就是把所有不同种类的信息( Heterogeneous
Information )连接在一起而得到的一个关系网络。知识图谱提供了从 关系 的角度去分析问题的能力。
 
互联网、大数据的背景下,谷歌、百度、搜狗等搜索引擎纷纷基于该背景,创建自己的知识图谱
Knowledge Graph (谷歌)、知心(百度)和知立方(搜狗),主要用于改进搜索质量。

2.2 图数据库

一般情况下,我们使用数据库查找事物间的联系的时候,只需要短程关系的查询(两层以内的关联)。
当需要进行更长程的,更广范围的关系查询时,就需要图数据库的功能。而随着社交、电商、金融、零
售、物联网等行业的快速发展,现实世界的事物之间织起了一张巨大复杂的关系网,传统数据库面对这
样复杂关系往往束手无策。因此,图数据库应运而生。
 
图数据库 (Graph database) 指的是以图数据结构的形式来存储和查询数据的数据库。
 
知识图谱中,知识的组织形式采用的就是图结构,所以非常适合用图库进行存储。

2.3 图形数据库优势

在需要表示多对多关系时,我们常常需要创建一个关联表来记录不同实体的多对多关系。如果两个实体
之间拥有多种关系,那么我们就需要在它们之间创建多个关联表。而在一个图形数据库中,我们只需要
标明两者之间存在着不同的关系。如果希望在两个结点集间建立双向关系,我们就需要为每个方向定义
一个关系。 也就是说,相对于关系型数据库中的各种关联表,图形数据库中的关系可以通过关系属性这
一功能来提供更为丰富的关系展现方式。因此相较于关系型数据库,图形数据库的用户在对现实进行抽
象时将拥有一个额外的武器,那就是丰富的关系。

优势总结
  • 性能上,对长程关系的查询速度快
  • 擅于发现隐藏的关系,例如通过判断图上两点之间有没有走的通的路径,就可以发现事物间的关联

3、Neo4j基础

3.1 什么是Neo4j

Neo4j是一个开源的 无Shcema的 基于java开发的 图形数据库,它将结构化数据存储在图中而不
是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎。程序数据是
在一个面向对象的、灵活的网络结构下,而不是严格、静态的表中,但可以享受到具备完全的事务
特性、企业级的数据库的所有好处。
 
https://db-engines.com/en/ranking
 

3.2 Neo4j模块构建

Neo4j 主要构建块

  • 节点
  • 属性
  • 关系
  • 标签
  • 数据浏览器

节点

节点是图表的基本单位。 它包含具有键值对的属性

属性

属性是用于描述图节点和关系的键值对

Key =
 
其中 Key 是一个字符串
 
值可以通过使用任何 Neo4j 数据类型来表示
 

关系

关系是图形数据库的另一个主要构建块。 它连接两个节点,如下所示。

这里 Emp Dept 是两个不同的节点。 “WORKS_FOR” Emp Dept 节点之间的关系。
 
因为它表示从 Emp Dept 的箭头标记,那么这种关系描述的一样
 
Emp WORKS_FOR Dept
 
每个关系包含一个起始节点和一个结束节点。
 
这里 “Emp” 是一个起始节点。
 
“Dept” 是端节点。
 
由于该关系箭头标记表示从 “Emp” 节点到 “Dept” 节点的关系,该关系被称为 进入关系 “Dept” 节点。
 
并且 外向关系 “Emp” 节点。
 
像节点一样,关系也可以包含属性作为键值对。
 

标签

Label 将一个公共名称与一组节点或关系相关联。 节点或关系可以包含一个或多个标签。 我们可以为现
有节点或关系创建新标签。 我们可以从现有节点或关系中删除现有标签。
 
从前面的图中,我们可以观察到有两个节点。
 
左侧节点都有一个标签: “EMP” ,而右侧节点都有一个标签: “Dept”
 
这两个节点之间的关系,也有一个标签: “WORKS_FOR”
 
注: - Neo4j 将数据存储在节点或关系的属性中。
 

3.3 Neo4j的主要应用场景

社交媒体和社交网络
 
当使用图形数据库为社交网络应用程序提供动力时,可以轻松利用社交关系或根据活动推断关系。
查询社区聚类分析,朋友的朋友推荐,影响者分析,共享和协作关系分析等
 
推荐引擎和产品推荐系统
 
图形驱动的推荐引擎通过实时利用多种连接,帮助公司个性化产品,内容和服务。
内容和媒体推荐,图形辅助搜索引擎,产品推荐,专业网络,社会推荐。
 
身份和访问管理
 
使用图形数据库进行身份和访问管理时,可以快速有效地跟踪用户,资产,关系和授权。
查询访问管理,资产来源,数据所有权,身份管理,互连组织,主数据,资源授权
 
金融反欺诈多维关联分析场景
 
通过图分析可以清楚地知道洗钱网络及相关嫌疑,例如对用户所使用的帐号、发生交易时的 IP 地址、
MAC 地址、手机 IMEI 号等进行关联分析。

3.4 Neo4j环境搭建

Neo4j环境Linux下搭建
 
(1). 切换到 Linux 下 到安装目录 neo4j 上传安装包 或者 下载安装包,这里需要注意,Neo4j的4.0版本以上需要jdk11的支持
 
使用 ftp 工具上传 neo4j-community-3.5.17.tar liunx
或者 wget https://neo4j.com/artifact.php?name=neo4j-community-3.5.17-unix.tar.gz
 
(2). 解压
 
tar -xvf neo4j-community-3.5.17.tar
 
(3). 修改配置文件 neo4j.conf
 
vi conf/neo4j.conf
 
主要是修改 允许远程访问的地址 把对应的注释打开即可
 
dbms.connectors.default_listen_address=0.0.0.0
 
(4). 开放对应的访问端口 默认要开放 7474 7687
 
fifirewall-cmd --zone=public --add-port=7474/tcp --permanent
 
fifirewall-cmd --zone=public --add-port=7687/tcp --permanent
 
systemctl reload fifirewalld
 
(5). 启动
 
./bin/neo4j start
 
(6). 使用浏览器 访问服务器上的 neo4j
 
http://127.0.0.1:7474
 
默认的账号是 neo4j 密码 neo4j 这里第一次登录的话会要求修改密码
 
Windows 下的安装
 
(1). https://neo4j.com/download-center/#community 下载最新的 Neo4j Server 安装文件
 
可以看到 neo4J 软件 exe zip 格式的所有版本,这里需要注意,Neo4j的4.0版本以上需要jdk11的支持
 
(2). 下载 Neo4j 3.5.17 (zip)
 
(3). 解压
 
(4). 修改配置文件
 
dbms.connectors.default_listen_address=0.0.0.0
 
(5) . 通过 neo4j.bat install-service 安装 neo4j 服务
 
修改文件 bin/neo4j.ps1
 
Import-Module "neo4j 的主目录 \bin\Neo4j-Management.psd1"
 
(6).neo4j.bat 启动
 
neo4j.bat start
 
(7). 使用浏览器 访问服务器上的 neo4j
 
http://127.0.0.1:7474
默认的账号是 neo4j 密码 neo4j 这里第一次登录的话会要求修改密码

 

3.5 Neo4j数据浏览器

数据浏览器访问
 
一旦我们安装 Neo4j ,我们可以访问 Neo4j 数据浏览器使用以下 URL
 
http:// localhost:7474/browser/
 

Neo4j 数据浏览器用于执行 CQL 命令并查看输出输出。
 
这里我们需要在美元提示符处执行所有 CQL 命令: “$” CREATE(cc:CreditCard)
 
在美元符号后键入命令,然后单击 执行 按钮运行命令。
 
它与 Neo4j 数据库服务器交互,检索和显示下面的结果到那个美元提示。
 
使用 “VI 视图 按钮以图形格式查看结果。 上图以 “UI 视图 格式显示结果。
 

导出 CSV 或者 JSON
 
单击 导出 CSV” 按钮以 csv 文件格式导出结果
 
------------------------------------------------------------------------------------------------------------------------------
在公司里面基础业务逻辑curd+简单缓存写多了,对个人发展真的非常不利,自己通过碎片时间学习总是不系统,各种版本问题也让人经常受挫,记忆上记得最新的忘了前面的,面试时总错过机会,偶然在拉勾上看到有java高薪训练营,对标阿里P7,看课程设计中广度和深度都有,就报上了,现在学习了40%+,手写mybatis+源码讲解、springboot源码、分布式理论及集群场景化、Dubbo、SpringCloud。。。,受益良多,自信了很多,相信学完后能力有较大提升,可以找到心仪的工作。​​​​​​​
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图和Neo4j 的相关文章

  • 查询 mongodb 返回今天创建的文档

    我如何编写今天创建的结果文档的过滤器 我知道 ObjectId 有时间戳 我试过这个 db doc find id gte ObjectId getTimestamp getTime 我可以写吗 db doc find id getTime
  • 如何删除neo4j中的所有索引?

    我想使用 cypher 批量删除所有存在的索引 可以吗 我正在使用 neo4j 3 4 7 DROP INDEX ON Label attributename 如果我在稍后阶段创建相同的索引 它会替换现有索引吗 删除所有索引和约束的快速方法
  • Neo4JClient:如何创建关系?

    我看到了一篇具有相同标题的帖子 但不幸的是无法通过查看给定的示例找到解决方案 我通过以下方式创建了节点 private static void createExampleNetwork GraphClient client try Cyph
  • Cypher - 匹配两个不同的可能路径并返回两者

    我有一个数据集 我在这里作为示例表示 http console neo4j org id 3dq78v http console neo4j org id 3dq78v 我想要做的是对于图表中的每个 Z 节点 该示例只有一个 但我有很多 我
  • 在 Neo4j 中可视化连接的组件

    我可以使用下面的代码找到图中最密集连接的组件 CALL algo unionFind stream pnHours YIELD nodeId setId groupBy setId storing all node ids of the s
  • Mongoose:find() 忽略重复值

    我有一只 聊天 猫鼬Schema它具有以下属性 const schema mongoose Schema recipient type mongoose Types ObjectId required true ref User sende
  • Firebase 数据库 - 编码错误

    我是 Firebase 的新手 我想使用他们的数据库 但编码似乎存在一些问题 这是我使用 UTF 8 编码的示例 json Stack This is madness Overflow 666 这就是当我将 json 导入 Firebase
  • Neo4j 的 Cypher 查询语言是开源的吗?

    Neo4j的语言Cypher的现状如何 我真的很喜欢它 但我想避免 Neo4j 锁定 是否还有像 Gremlin 中那样的其他 Cypher 界面 Regards Cypher 完全是 OSS 请参阅https github com neo
  • 检查 DynamoDB 中是否存在表的最佳方法是什么?

    检查 DynamoDb 中是否存在表的最佳方法是什么 如果代码是 PHP 语言 我将不胜感激 要么活跃 要么不活跃 稍后作为错误代码 400 的各种情况的示例添加 检查表是否存在很容易 它可以有以下之一 表状态 gt 创建 活动 删除或更新
  • OT 和 CRDT 之间的区别

    有人可以简单地向我解释一下操作转换和 CRDT 之间的主要区别吗 据我了解 两者都是允许数据在分布式系统的不同节点上无冲突地收敛的算法 在哪种用例中您会使用哪种算法 据我了解 OT主要用于文本 而CRDT更通用 可以处理更高级的结构 对吧
  • 如何在neo4j中显示屏幕上的所有节点

    我有近 5000 个节点Recipes和 5 个节点Meal Types在 Neo4j 数据库中 目前他们之间没有任何关系 我正在下面运行 CQL MATCH n RETURN n LIMIT 100000 这运行良好 但它返回与相关的节点
  • 使用 neo4j 建模有序树

    我刚刚开始使用 neo4j 并且了解图形和关系的原理 但是我在想要建模的某些结构方面遇到了一些麻烦 我想在编程语言项目中使用它 并存储已解析源文件的 AST 从那里 我计划向节点添加大量额外的数据和关系 以帮助分析和工具 但基本的 AST
  • 如何返回每个另一个节点属性的最大计数

    我需要计算一位作曲家的音乐作品每十年被演奏了多少次 然后只返回每十年演奏次数最多的一首作品 除了过滤除每十年最高计数之外的所有内容之外 该密码可以执行所有操作 match c Composer CREATED BY w Work lt 2
  • 使用java将数据从Neo4j导出到csv

    将数据从 Neo4j 导出到 CSV 的最佳方法是什么 我已使用链接中的 CSV 导入器将数据从 csv 导入到 neo4jhttps github com sroycode neo4j import https github com sr
  • 如何使用c#从数据桶中获取所有文档?

    如何获取数据桶中的所有文档 我尝试过一个示例 但我只能获得一个特定的文档 这是我的代码 CouchbaseClient oclient oclient new CouchbaseClient vwspace data bucket name
  • 如何从 Neo4j 服务器插件登录?

    我正在尝试调试我正在编写的 Neo4J 服务器插件中的问题 有可以输出的日志吗 在哪里或如何执行此操作并不明显 好问题 我想你可以使用 Java 日志记录吗 这应该被路由到正常的日志系统中
  • 一次更新猫鼬中的多个文档

    我有一个用户文档数组 每个用户都有关注者属性 它是一个数字 我只想将此属性增加 1 然后立即更新数据库中的所有这些用户文档 更多细节 在请求中 我有一组用户 id 我使用这些 id 进行查询以获取一组用户文档 const users awa
  • AWS DynamoDB 写后读一致性 - 理论上它是如何工作的?

    大多数nosql解决方案仅使用最终一致性 并且考虑到DynamoDB将数据复制到三个数据中心 如何保持写后读一致性 解决此类问题的通用方法是什么 我认为这很有趣 因为即使在 MySQL 复制中 数据也是异步复制的 我将详细告诉您 Dynam
  • 如何结识有相同兴趣的朋友的朋友?

    交朋友的朋友很容易 我得到了这个 看起来效果很好 g v 1 in FRIEND in FRIEND filter it g v 1 但我想做的只是结交有相同兴趣的朋友的朋友 下面我希望 Joe 被推荐为 Moe 而不是 Noe 因为他们没
  • MongoDB中批量FindAndModify的解决方案

    我的用例如下 我在 mongoDB 中有一组文档 我必须发送这些文档进行分析 文件格式如下 id ObjectId 517e769164702dacea7c40d8 日期 1359911127494 状态 可用 其他字段 我有一个阅读器进程

随机推荐