Neo4j 基础知识
以图的方式去思考
七桥问题
什么是七桥问题?
七桥问题来自遥远的1736年,数学家欧拉的一个思考。
有这么一个城市,被河流分割成四部分,由7座桥梁连接起来。欧拉想:有没有一种方法,可以走遍这个城市并且只需要穿过每座桥一次?
为了解决这个问题,欧拉想了很久,最终这个小伙儿恍然大悟,他可以把这个复杂的问题抽象化,然后再去思考解决方案。
他把陆地和桥梁都抽象化,每块陆地都化为一个点,每个桥梁都化为一条线,那么七桥问题就抽象为下面这样一个问题了:
我们在这里将它称为一个“图”,抽象之后欧拉很快就得出了结论:无论从哪个点开始,以什么样的顺序过桥,都不可能在只经过一次桥的的情况下走遍所有的点。
我们讲这个小伙儿的故事,目的就是想告诉大家“图”的起源,图作为一种建模和分析数据的方法,可以帮助我们了解数据之间的联系,对数据集产生真正的洞察力,来解决我们生产生活中各类的复杂问题。
图的元素
我们可以很清晰的看出构成图的两个基本元素:
- 节点【又称顶点】
- 关系【又称边】
节点
节点,就是上面图里的小圆圈。节点的含义是不固定的,在不同的问题里,它可以代表不同的事物。
例如,在七桥问题中,节点表示的就是陆地。
再举个栗子:研究社交关系图中,每个节点都代表一个人。
图热衷于研究节点之间的关系,也许单独的两个人并不能引起你多大的兴趣,但将两个人联系在一起的时候,人们往往就会有抑制不住的好奇。
关系
关系,就是连接这些小圆圈的线。
我们利用关系来描述节点直接是如何相互连接的,
比如这个社交图,M和S有着婚姻关系,M和G有着工作关系,人与人之间的关系十分清晰明了。
现在我们再引入一个人H。
M和H都为G工作,我们或许可以推断出M和H彼此认识,如果如此,S和H会不会也有可能相识?
这些问题都可以用图来回答。
需要注意的是:关系并不像大家所认为的是一个名词,相反,关系通常是一个动词,A嫁给B,C住在D......
图的结构
图的特征
无向图的关系是双向或者对称的。
有向图的关系是不对称的。
加权图中,节点之间的关系会带有一个值,它可能代表成本、时间、距离、优先级......
如果你想找到两个地方的最短路径,利用算法计算图中两个节点之间的最短距离会是一个有效的方法。
图的遍历
为了找到两个地方的最短路径,程序需要遍历所有可能的路径来找到最短路径。
遍历图的时候需要遵循图中的关系,不同类型的遍历会影响程序的性能,你可以选择多次遍历关系,也可以选择多次访问节点,不同的处理方法,程序的性能也不一样。
Neo4j 的 Cypher 语言针对节点遍历进行了优化,因此关系不会被多次遍历,这对应用程序来说是一个巨大的性能提升。
图无处不在
图的应用
我们可以利用图看到无处不在的事物之间的联系。
以下是一些应用案例
电子商务和实时推荐
许多在线商店传统上是在关系数据库上构建和运行的。 但是通过添加一个图数据库,我们可以提供实时推荐的功能。
你可能还熟悉你最喜欢的在线商店中的 购买 *{产品 A}* 的人还购买了… 部分。 由于需要将大量数据保存在内存中,因此生成这些类型的推荐的计算成本可能很高。 这就需要部署批处理以生成推荐。
图数据库在此用例中的优势在于,需要遍历更小比例的图就能生成推荐。 你可以简单地从一个产品节点遍历购买该产品的用户,然后再遍历他们购买的后续产品。
鉴于图中有关客户、订单和产品的现有数据,我们可以根据客户订购产品的次数来推断产品的评分。
运输和物流
这是一个由 Neo4j 社区成员提供的与供应链管理相关的示例数据模型。 被建模的实体包括原材料供应商、供应商、产品、批发商和零售商。 所有这些实体都位于某个地方,它们之间的距离将影响产品的运输速度。
有了这张图,人们可以回答以下问题:
- 根据距离,谁是每个零售商的最佳批发商?
- 哪家原料供应商会为特定零售商提供最新鲜的产品?
- 哪家零售商提供本地种植的产品?
- 我们如何评价每条供应链?
属性图
什么是属性图?
图的基本元素是:节点、关系
如果你想构建一个属性图,你需要:节点、关系、标签、属性
标签
对节点添加标签,表示该节点属于图的子集。 标签在 Neo4j 中很重要,因为它们为 Cypher 语句提供了起点。
让我们以 Michael 和 Sarah 为例——在这种情况下,这两个节点都是 Person。
我们可以通过向这些节点添加更多标签来完善图; Michael 标记为 Male,Sarah 是 Female。 在这种情况下,Michael 是一家公司的 雇员,但我们没有任何关于 Sarah 的就业状况的信息。
Michael 在一家名为 Graph Inc 的 Company 工作,因此我们可以将该标签添加到代表公司的节点中。
属性
通过添加 firstName 和 lastName 属性,我们可以看到 Michael 节点指的是 Michael Faraday,它以法拉第感应定律、法拉第笼而闻名,而较少被称为派对气球的发明者。 Michael 出生于 1791 年 9 月 22 日。
Sarah 的全名是 Sarah Faraday,她的 maidenName 是 Barnard。
通过查看 Graph Inc 节点上的 name 属性,我们可以看到它指的是公司 Graph Inc,其 city 为 London,拥有 56 名员工 (numEmployees),并以 Graph Incorporated 和 GI (dba) 为名。
关系类型
Neo4j 图中的每个关系 必须 有一个类型。 这允许我们在查询时选择我们将遍历图的哪一部分。
例如,我们可以遍历 Michael 的 每一个 关系,或者我们可以指定 MARRIED_TO 关系,这样仅在 Sarah 节点处结束。
关系属性
与节点一样,关系也可以具有属性。这些可以指加权图中的成本或距离,或者只是为关系提供额外的上下文。
在我们的图中,可以在 MARRIED_TO 关系上放置一个属性来保存 Michael 和 Sarah 的结婚日期。 WORKS_AT 关系有一个 roles 属性来表示员工在公司担任的角色。 如果 Michael 也在另一家公司工作,那么他与另一家公司的 WORKS_AT 关系对于 roles 属性将具有不同的值。
原生图的优势
Neo4j 是一个原生图数据库,这意味着从数据存储到查询语言的所有内容都是专门为遍历而设计的。
原生图数据库与其他数据库的区别在于无索引邻接的概念。