Graph database concepts
Graph database concepts
图数据结构由nodes(离散对象)组成,这些nodes可以通过relationships(关系)连接起来。
Example 1. 图结构的概念.
xxxxxxxxxx pycharm
图数据库模型由一下属性组成:
- Nodes 描述域的实体(离散对象).
- Nodes 可以有零个或多个labels来定义(分类)它们是什么类型的节点.
- Relationships 描述source node和target node之间的连接.
- Relationships 总是有一个方向.
- Relationships 必须有一个type(类型)来定义(分类)他们是什么类型的关系.
- Nodes 和Relationships可以具有properties(键值对),这将进一步描述节点和复杂的关系
在数学中,对图的研究称之为图论。在图论中:节点被称为顶点或点。关系被称为边、连接或线.
1. Example graph
下图所示的例子,介绍了属性图的基本概念:
Example 2. 图的示例.
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.
属于这个节点的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.
在下面示例图中,Person
、Actor
和Movie
都是用于描述节点的节点标签。也可以添加更多标签来表示数据的不同维度。
Example 5. Multiple labels.
4. Relationship
Relationship
描述了一个source node和一个target node之间是如何关联的。
Tips: 节点可能与自身有连接。(节点自己关联自己)
A relationship:
- 连接一个source node和一个target node.
- 有方向(一个连接只能有一个方向).
- 必须有一个type(类型)来定义(分类)是什么样的关系.
- 可以使用属性(键值对)来进一步描述这个type的关系
Relationship
将节点连接起来组成一个图形,这个图形就像一个list
、tree
、map
其中任何一个都可以组合成更复杂、连接丰富的结构
Example 6. 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 node和target node.
关系总是有方向的。如果方向是没有用的,那可以忽略它。不需要添加相反方向的重复关系,除非特殊需要.
例如,你给他转帐,他给你转账.
节点可以与自己有关系。例如,用关系表达Tom Hanks
认识他自己,如下图所示:
Example 7. Relationship to a single node.
5. Relationship type
一个关系只能有一种type(类型).
下图是 Tom Hanks
--> Forrest Gump
的关系,此关系的类型是ACTED_IN
:
Example 8. Relationsip type.
可以看到关系是有方向的
6. Properties
属性是在node(节点)和Relationship(关系)上存储数据的键-值对.
The value part of a property:
- 可以保存不同的数据类型,例如:
number
,string
, orboolean
. - 可以保存一个 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
这个电影(见下图虚线):
遍历结果返回一个路径长度为1
的关系:
最短路径的长度为
0
。它指单个节点,但是这个示例并没有符合我们条件的路径。
Example 13. Path of length zero.
只包含单个节点的路径的长度为0
。
Example 14. Path of length one.
包含一个关系的路径的长度为' 1 '。
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/
- 查找某人或者模糊匹配某人
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
- 查找具体某人的关系
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
- 探索人或者物之间的关系
#求两个节点之间的最短路径之一
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
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
example questions
乳腺癌的症状有哪些?
最近老流鼻涕怎么办?
为什么有的人会失眠?
失眠有哪些并发症?
失眠的人不要吃啥?
耳鸣了吃点啥?
哪些人最好不好吃蜂蜜?
鹅肉有什么好处?
肝病要吃啥药?
板蓝根颗粒能治啥病?
脑膜炎怎么才能查出来?
怎样才能预防肾虚?
感冒要多久才能好?
高血压要怎么治?
白血病能治好吗?
什么人容易得高血压?
糖尿病
全血细胞计数能查出啥来