Graph database concepts

发布时间 2023-04-03 11:07:53作者: edclol

Graph database concepts

图数据结构由nodes(离散对象)组成,这些nodes可以通过relationships(关系)连接起来。

Example 1. 图结构的概念.

xxxxxxxxxx ​pycharm

graph concept three nodes

图数据库模型由一下属性组成:

  • Nodes 描述域的实体(离散对象).
  • Nodes 可以有零个或多个labels来定义(分类)它们是什么类型的节点.
  • Relationships 描述source nodetarget node之间的连接.
  • Relationships 总是有一个方向.
  • Relationships 必须有一个type(类型)来定义(分类)他们是什么类型的关系.
  • NodesRelationships可以具有properties(键值对),这将进一步描述节点和复杂的关系

在数学中,对图的研究称之为图论。在图论中:节点被称为顶点或点。关系被称为边、连接或线.

1. Example graph

下图所示的例子,介绍了属性图的基本概念:

Example 2. 图的示例.

graph simple

Example 3. Cypher语言.

使用Cypher语言CREATE创建示例图

CREATE (:Person:Actor {name: 'Tom Hanks', born: 1956})-[:ACTED_IN {roles: ['Forrest']}]->(:Movie {title: 'Forrest Gump'})<-[:DIRECTED]-(:Person {name: 'Robert Zemeckis', born: 1951})

2. Node

节点用来表示一个范围的entities(离散对象)。

最简单的图是没有关系的单个节点。考虑以下由单个节点组成的图.

Example 4. Node.

graph single node

属于这个节点的label(标签)有:

  • Person
  • Actor

这个节点的properties(属性)有:

  • name: Tom Hanks
  • born: 1956

可以用Cypher 语言来创建这个节点:

CREATE (:Person:Actor {name: 'Tom Hanks', born: 1956})

3. Node labels

标签通过将节点分组(分类)形成域,其中所有具有特定标签的节点都属于同一集合。

例如,代表用户的所有节点都可以使用标签User进行标记。查找具有姓名叫张三的所有User

标签可以添加和删除,因此它们可以用于标记节点的状态。

例如,Suspended标签可以用来表示暂停使用的银行账户,Seasonal标签可以表示当前正处于销售季节的蔬菜。

A node can have zero to many labels.

在下面示例图中,PersonActorMovie都是用于描述节点的节点标签。也可以添加更多标签来表示数据的不同维度。

Example 5. Multiple labels.

graphdb simple labels multi

4. Relationship

Relationship描述了一个source node和一个target node之间是如何关联的。

Tips: 节点可能与自身有连接。(节点自己关联自己)

A relationship:

  • 连接一个source node和一个target node.
  • 有方向(一个连接只能有一个方向).
  • 必须有一个type(类型)来定义(分类)是什么样的关系.
  • 可以使用属性(键值对)来进一步描述这个type的关系

Relationship将节点连接起来组成一个图形,这个图形就像一个listtreemap

其中任何一个都可以组合成更复杂、连接丰富的结构

Example 6. Relationship.

graph example relationship

上图中关系的类型: ACTED_IN

上图中关系的属性:

  • roles: ['Forrest']
  • performance: 5

The roles property has an array value with a single item ('Forrest') in it.

可以用Cypher 语言来创建这个关系:

CREATE ()-[:ACTED_IN {roles: ['Forrest'], performance: 5}]->()

创建关系的时候必须有source nodetarget node.

关系总是有方向的。如果方向是没有用的,那可以忽略它。不需要添加相反方向的重复关系,除非特殊需要.

例如,你给他转帐,他给你转账.

节点可以与自己有关系。例如,用关系表达Tom Hanks 认识他自己,如下图所示:

Example 7. Relationship to a single node.

graphdb nodes and rel self

5. Relationship type

一个关系只能有一种type(类型).

下图是 Tom Hanks--> Forrest Gump的关系,此关系的类型是ACTED_IN

Example 8. Relationsip type.

graphdb nodes and rel

可以看到关系是有方向的

6. Properties

属性是在node(节点)和Relationship(关系)上存储数据的键-值对.

The value part of a property:

  • 可以保存不同的数据类型,例如: number, string, or boolean.
  • 可以保存一个 list (array) ,例如:[1, 2, 3],or [2.71, 3.14],or ['abc', 'example'],or [true, true, false].

Example 9. Number

CREATE (:Example {a: 1, b: 3.14})

Example 10. String and boolean

CREATE (:Example {c: 'This is an example string', d: true, e: false})

Example 11. Lists

CREATE (:Example {f: [1, 2, 3], g: [2.71, 3.14], h: ['abc', 'example'], i: [true, true, false]})

7. Traversals and paths

traversal (遍历)是你为了索取一个问题的答案怎样取查找图,例如:我的朋友喜欢哪些我不知道的音乐?

如果停电会影响我的哪些web服务?我怎么样从天安门走到八达岭长城?

遍历图意味着根据某些规则遵循关系来访问节点。在大多数情况下,只访问图的一个子集。

Example 12. Path matching.

比如:为了找出 Tom Hanks出演过的电影,那么遍历将从Tom Hanks节点开始,跟随ACTED_IN类型的连接到下一个节点,结果就是Forrest Gump 这个电影(见下图虚线):

graphdb traversal

遍历结果返回一个路径长度为1的关系:

graphdb path

最短路径的长度为0。它指单个节点,但是这个示例并没有符合我们条件的路径。

Example 13. Path of length zero.

只包含单个节点的路径的长度为0

graphdb path zero

Example 14. Path of length one.

包含一个关系的路径的长度为' 1 '。

graphdb path example loop

8. Indexes

图数据库亦可以创建索引,创建索用于提高查询性能. 这里不详细展开描述.

9. Naming conventions

节点,关系,属性是不同的概念,为了更好的区分,采用不同的命名形式.

命名规范建议:

Graph entity Recommended style Example
Node label 大驼峰,以大写字符开头 :VehicleOwner
Relationship type 大写,用下划线分隔单词 :OWNS_VEHICLE
Property 小驼峰,以小写字符开头 firstName

10. Sample Cypher

演示图数据库:http://122.112.255.102:7474/

  1. 查找某人或者模糊匹配某人
MATCH (n:`居民`)
WHERE n.name = "刘顺平"
RETURN n

MATCH (n:`居民`{name:"刘顺平"})
RETURN n

MATCH (n:`居民`)
WHERE n.name STARTS WITH '夏'
RETURN n.name limit 10

MATCH (n:`居民`)
WHERE n.name ENDS WITH '平'
RETURN n limit 10
  1. 查找具体某人的关系
MATCH (n:`居民` {name:"李翔松"})-[*1..4]-(l)
RETURN DISTINCT l

MATCH (n:`居民` {name:"李翔松"})-[*1..4]->(l)
RETURN DISTINCT l

MATCH (n:`居民` {name:"李翔松"})-[*1..4]-(l)
RETURN DISTINCT l,n

#某人关系为其它的朋友 大于3才展示
MATCH (n:`居民` {name: "李翔松"})
RETURN n

MATCH (n:`居民` {name: "李翔松"})-[`其它`]-(friend)
WITH n, count(friend) AS friendsCount
WHERE friendsCount > 3
RETURN n, friendsCount
         

  1. 探索人或者物之间的关系
#求两个节点之间的最短路径之一
MATCH p=shortestPath(
  (n:`居民` {name:"李桂艳"})-[*]-(m:`居民` {name:"冯莲花"})
)
RETURN p

MATCH p=shortestPath(
  (n:`居民` {name:"李桂艳"})-[*]-(m:`居民` {name:"唐昌利"})
)
RETURN p

#求两个节点之间的所有最短路径
MATCH
  (martin:`居民` {name: '李桂艳'} ),
  (michael:`居民` {name: '唐昌利'}),
  p = allShortestPaths((martin)-[*]-(michael))
RETURN p

#贫血和不孕不育所有最短路径
MATCH
  (martin:Disease {name: '贫血'} ),
  (michael:Disease {name: '不孕不育'}),
  p = allShortestPaths((martin)-[*]-(michael))
RETURN p

#认识一个人不想麻烦超过15个人
MATCH
  (martin:`居民` {name: '李桂艳'}),
  (oliver:`居民` {name: '唐昌利'}),
  p = shortestPath((martin)-[*..15]-(oliver))
RETURN p

#s到疾病 距离5到10 
MATCH p = (n:Food)-[*5..10]-(m:Disease)
RETURN nodes(p) limit 5

MATCH p = (n:Food{name:"冬菇全鸡"})-[*5]-(m:Disease)
RETURN nodes(p) limit 5

#认识一个人但是不想依赖配偶关系
MATCH
  (charlie:`居民` {name: '李桂艳'}),
  (martin:`居民` {name: '唐昌利'}),
  p = shortestPath((charlie)-[*]-(martin))
WHERE none(r IN relationships(p) WHERE type(r) = '配偶')
RETURN p

#食物到疾病 距离为4 不是通过并发症连接
MATCH p = (n:Food)-[*4]-(m:Disease)
RETURN nodes(p) limit 5
                    
MATCH p = (n:`居民`)-[*4]-(m:`居民`)
RETURN nodes(p) limit 5

MATCH p = (n:Food)-[*4]-(m:Disease)
WHERE none(r IN relationships(p) WHERE r.name = '并发症')
RETURN nodes(p) limit 5



MATCH p = ()-[*2]-()
RETURN nodes(p) limit 5

MATCH p = ()-[*4]-()
RETURN nodes(p) limit 5

MATCH p = (n:Disease)-[*4]-(m:Disease)
RETURN nodes(p) limit 5

MATCH p = (n:Food)-[*4]-(m:Disease)
RETURN nodes(p) limit 5




MATCH p = ()-[:其它|:配偶]-()
RETURN nodes(p) limit 5

MATCH p = ()-[:其它]-()-[:配偶]-()
RETURN nodes(p) limit 5

MATCH p = ()-[:其它*1..3]-()
RETURN p limit 5

MATCH p = ()-[:配偶*2..]-()
RETURN p limit 5

MATCH (a)-->()<--(c)
RETURN a limit 10

MATCH (a)-->()<--(c)-->()
RETURN a limit 10

MATCH (a)--()--(c)--()
RETURN a limit 10

数据示例来源:https://github.com/liuhuanyong/QASystemOnMedicalKG

11.advantages and disadvantages

优点:

  • 开源 NoSQL 数据库,原生的图数据库,2003 年开始开发,使用 scala和java 语言,2007年开始发布;
  • 世界上最先进的图数据库之一,提供原生的图数据存储,检索和处理;
  • 采用属性图模型(Property graph model),极大的完善和丰富图数据模型;
  • 专属查询语言 Cypher,直观,高效;
  • 真正的ACID交易
  • 高可用性,扩展到数十亿个节点和关系
  • 遍历高速查询
  • 声明式图查询语言。
  • 数据的插入,查询操作很直观,不用再像之前要考虑各个表之间的关系。
  • 提供的图搜索和图遍历方法很方便,速度也是比较快的。

缺点:

  • 社区版本是单机单节点

  • 大批量导入数据麻烦。最不能让人忍受的就是极慢的插入速度。可能是因为创建节点和边的时候需要保存一些额外信息(为了查询服务)。不知道是不是我代码的问题,插入10000个节点,10000条边花了将近10分钟.

  • 超大节点。当有一个节点的边非常多时(常见于大V),有关这个节点的操作的速度将大大下降。这个问题很早就有了,官方也说过会处理,然而现在仍然不能让人满意。

  • 提高数据库速度的常用方法就是多分配内存,然而看了官方操作手册,貌似无法直接设置数据库内存占用量,而是需要计算后为其”预留“内存.

11.Usage scenarios

  • 知识图谱
    知识图谱是图数据库关联最为紧密、应用范围最广的应用场景。知识图谱对海量信息进行智能化处理,形成大规模的知识库并进而支撑业务应用。知识图谱中图数据库具有存储和查询两方面的技术优势,可为多种行业提供服务。
  • 社交领域
    人与人在线上和线下存在海量的关系数据,形成了一张天然的,具有复杂关联度的图,能够做社区发现、舆论追踪、用户推荐等丰富的应用场景。
  • 金融领域
    通过建立客户的关系图,根据客户社会关系、近期交易记录等,来决定是否授权放贷、放贷金额等。提升金融行业的风控能力,并可根据资金交易图谱实现反洗钱、反欺诈等系统。
  • 医疗领域
    根据病人的病理特征、既往病史、历史用药、保险情况等多维数据构造一棵大的决策树或者医疗知识图谱,提高诊断效率和准确性,共享医疗资源。
  • 政企领域
    在国家推行智慧城市项目的背景下,图数据库技术可在智能交通、智能电网、数字政务等场景应用,打通政、企、民三端,服务政企,惠及民生。
  • 零售领域
    图数据库技术通过整合用户的浏览习惯和购买历史,可以分析出各类商品的潜在用户群体,实现智能推荐和精准营销,为买家提供良好购物体验的同时,也使商家利益最大化。

12. medical knowledge graph

image-20220418122957358

image-20220418122941823

example questions

乳腺癌的症状有哪些?
最近老流鼻涕怎么办?
为什么有的人会失眠?
失眠有哪些并发症?
失眠的人不要吃啥?
耳鸣了吃点啥?
哪些人最好不好吃蜂蜜?
鹅肉有什么好处?
肝病要吃啥药?
板蓝根颗粒能治啥病?
脑膜炎怎么才能查出来?
怎样才能预防肾虚?
感冒要多久才能好?
高血压要怎么治?
白血病能治好吗?
什么人容易得高血压?
糖尿病
全血细胞计数能查出啥来