Neo4j进行数据建模
   
1.本教程适合学习了neo4j基本增删改查语法后进行学习
2.如果还不熟悉语法,本人非常详细的增删改查教程连接如下
3.学习本教程之后可以学习:
Neo4j 全网最详细教程
python对neo4j的api接口框架py2neo进阶教程:
py2neo框架学习全网最详细教程
    
    
    1.学习资料
   
    
    
    网站
   
- 
     Neo4j学习官网
感谢您下载 Neo4j – Neo4j 图形数据平台
 
    
    
    2.开始简介
   
    
    
    2.1图形数据建模(Graph Data Modeling)
   
    
    
    neo4j的组成部分
   
- 节点
 - 标签
 - 关系
 - 性能
 
    
    
    数据建模过程
   
- 1.了解领域并定义特定的用例,枚举用例
 - 
     2.开发初始图形数据模型
- 对节点(实体)建模
 - 对关系建模
 
 - 3.对初始数据测试模型
 - 4.使用cypher创建图形实例
 - 5.测试性能,定义的模型是否满足需求
 - 6.如果由于用例更改或者性能原因,进行重构图形数据模型
 - 7.重构后使用Cypher重新测试
 
图形数据建模是一个迭代过程。初始图形数据模型是一个起点,但随着了解有关用例的更多信息,或者如果用例发生更改,初始图形数据模型将需要更改。
    此外,您可能会发现,特别是当图形缩放时,您需要修改图形(
    
     重构
    
    )以实现关键用例的最佳性能。
   
    
    
    2.2数据领域(The Domain)
   
在数据建模过程中我们必须
- 描述具体项目的细节
 - 确定用户和系统
 - 
     对用例达成一致看法
- 用例就是具有哪些查询功能
 
 - 枚举用例
 
    
    
    电影领域
   
    在
    
     Neo4j基础
    
    课程中,向您介绍了一个“入门”电影图。
   
该域名包括电影、演戏或执导电影的用户以及为电影评分的用户。使此域有趣的是图中节点之间的连接或关系。
    
    
    使用案例
   
知识图谱项目的大多数用例都可以通过全面的问题列表来枚举。这些用例有助于定义知识图谱在运行时的行为方式。
以下是您将用于开发初始图形数据模型的用例:
- 电影中有哪些人表演?
 - 谁导演了一部电影?
 - 一个人出演了什么电影?
 - 有多少用户对一部电影进行了评分?
 - 谁是最年轻的电影演员?
 - 一个人在电影中扮演了什么角色?
 - 根据imDB的数据,特定年份收视率最高的电影是什么?
 - 演员出演了哪些戏剧电影?
 - 哪些用户给电影打了5分?
 
电影、演员、导演、用户四个类型的节点。
在我们的领域中,我们希望区分出演或执导电影的人和为电影评分的用户或评论者。我们有更多关于人们的信息,例如他们的出生日期,他们的tmdbId等。对电影进行评级的用户将被命名或识别。
    
    
    2.3数据模型
   
    
    
    模型类型
   
为应用程序执行图形数据建模过程时,至少需要两种类型的模型:数据模型、实例模型
    
    
    – 数据模型
   
- 含义:数据模型描述图形的标签、关系和属性。它没有将在图表中创建的特定数据。
 - 重要性:图形数据模型很重要,因为它定义了在应用程序创建和使用图形时将用于标签、关系类型和属性的名称。
 - 
     格式:
- label命名首字母大写,Example: Person, Company, …
 - relationship type命名全字母大写,Example: FOLLOWS, MARRIED_TO
 - property key命名小写字母开头, Example: age, firstName
 
 - 
     注意属性关键字property key名字可以不唯一,因为不同类型的节点也可以有同一个属性
     
    
    
    – 实例模型
   
- 
     图形数据建模过程的一个重要部分是针对用例测试模型。为此,您需要有一组示例数据,您可以使用这些数据来查看是否可以使用模型来测试我们的用例。
     
    
    
    3.模型节点(Modeling Nodes)
   
    
    
    3.1模型节点
   
    
    
    A 定义节点标签
   
实体是用例中的主要名词:食谱、成分、人、电影…
食谱中使用了哪些成分?谁嫁给了这个人?
电影中有哪些人表演?谁导演了一部电影?一个人出演了什么电影?
    
    
    B 节点属性
   
    
    
    节点属性的作用
   
- 唯一标识节点(上文提到不同节点属性关键字可以取相同,单内容必须唯一标识节点,可以拥有很多属性,起到唯一标识节点的作用的属性一个就够了)
 - 回答用例的特定详细信息(对节点的信息补充)
 - 返回数据(具有查询作用,利用属性返回相应的数据)
 
    
    
    在Cypher中的体现
   
- 
     定位点(开始查询的位置)。
- 
       
MATCH (p:Person {name: 'Tom Hanks'})-[:ACTED_IN]-(m:Movie) RETURN m
 - 查询人物类型节点且名字是Tom的,电影类型节点,关系边时acted_in的数据
 
 - 
       
 - 
     遍历图形(导航)。
- 
       
MATCH (p:Person)-[:ACTED_IN]-(m:Movie {title: 'Apollo 13'})-[:RATED]-(u:User) RETURN p,u
 - 查找人物类型节点,电影类型节点且标题为apollp13,用户类型的节点,前两个关系时actedin的,后两个关系时rated的演员和用户
 - 简而言之就是查找对apollo13电影的演员和评分用户
 
 - 
       
 - 
     从查询返回数据。
- 
       
MATCH (p:Person {name: 'Tom Hanks'})-[:ACTED_IN]-(m:Movie) RETURN m.title, m.released
 - 查找TomHanks演过的电影的标题和发布日期
 
 - 
       
 
    
    
    电影节点属性的解释
   
    
   
    以下是我们将为
    
     Movie
    
    节点定义的属性:
   
- 
- 电影标题(字符串)- 电影上映(日期)- 电影评级(0-10 之间的十进制)- 电影流派(字符串列表) 
    以下是我们将为
    
     Person
    
    节点定义的属性:
   
- 
- Person.name(字符串)- 出生人(日期)- 逝世人(日期) 
    
    
    
     3.2建立节点代码
    
   
MATCH (n) DETACH DELETE n;
MERGE (:Movie {title: 'Apollo 13', tmdbId: 568, released: '1995-06-30', imdbRating: 7.6, genres: ['Drama', 'Adventure', 'IMAX']})
MERGE (:Person {name: 'Tom Hanks', tmdbId: 31, born: '1956-07-09'})
MERGE (:Person {name: 'Meg Ryan', tmdbId: 5344, born: '1961-11-19'})
MERGE (:Person {name: 'Danny DeVito', tmdbId: 518, born: '1944-11-17'})
MERGE (:Person {name: 'Jack Nicholson', tmdbId: 514, born: '1937-04-22'})
MERGE (:Movie {title: 'Sleepless in Seattle', tmdbId: 858, released: '1993-06-25', imdbRating: 6.8, genres: ['Comedy', 'Drama', 'Romance']})
MERGE (:Movie {title: 'Hoffa', tmdbId: 10410, released: '1992-12-25', imdbRating: 6.6, genres: ['Crime', 'Drama']})
MATCH (n) RETURN n
    
    
    4.关系建模
   
    
    
    4.1关系建模(定义关系)
   
    
    
    A 关系定义:
   
关系是实体之间的连接**,连接是用例中的**谓词:
- 
     食谱
中使用
了哪些成分? - 
     谁
嫁给
了这个人? 
    
    
    B 关系类型命名标准:
   
全字母大写
    
    
    C 关系方向
   
Neo4j 中创建关系时,必须显式指定方向(代码从左到右写)
在运行时,在查询期间,通常不需要方向。
    
    
    D 节点属性的扇出
   
人可以有姓名属性,出生日期属性,但为了满足用例需求,可将姓、名、出生日期作为节点拿出来
例如,如果用例中存在满足某种条件的人物的姓氏是什么?
    
   
    
    
    E 关系属性
   
可以将属性添加到关系中以进一步描述关系,如结婚关系的日期属性,工作关系的角色属性
    
   
    
    
    
     EXAMPLE1(根据用例确定关系模型)
    
   
    
     以下是一些用例
    
   
- 
     电影中有哪些人
表演
? - 
     谁
导演了
一部电影? - 
     一个人
出演
了什么电影? 
    
     那么关系就是
    
   
- ACTED_IN
 - DIRECTED
 
    
     所以数据模型为
    
   
    
   
    
     支持数据模型的实例模型
    
   
    
   
    
    
    
     EXAMPLE2(根据用例确定关系属性模型)
    
   
    
     一个人
    
    在
    
     某部电影
    
    中
    
     扮演
    
    了什么角色?
   
- 检索人员的姓名。
 - 遵循与电影ACTED_IN关系。
 - 按影片标题筛选影片。
 - 
     从两个节点之间的ACTED_IN关系中返回
角色
 
    
     构建数据模型
    
   
    
   
    
     构建数据模型的实力模型
    
   
    
   
    
    
    
     4.2创建初始关系代码
    
   
MATCH (apollo:Movie {title: 'Apollo 13'})
MATCH (tom:Person {name: 'Tom Hanks'})
MATCH (meg:Person {name: 'Meg Ryan'})
MATCH (danny:Person {name: 'Danny DeVito'})
MATCH (sleep:Movie {title: 'Sleepless in Seattle'})
MATCH (hoffa:Movie {title: 'Hoffa'})
MATCH (jack:Person {name: 'Jack Nicholson'})
// create the relationships between nodes
MERGE (tom)-[:ACTED_IN {role: 'Jim Lovell'}]->(apollo)
MERGE (tom)-[:ACTED_IN {role: 'Sam Baldwin'}]->(sleep)
MERGE (meg)-[:ACTED_IN {role: 'Annie Reed'}]->(sleep)
MERGE (danny)-[:ACTED_IN {role: 'Bobby Ciaro'}]->(hoffa)
MERGE (danny)-[:DIRECTED]->(hoffa)
MERGE (jack)-[:ACTED_IN {role: 'Jimmy Hoffa'}]->(hoffa)
    
    
    4.3更新新关系
   
    我们需要为新的用例重构模型:
    
     用例:哪些用户给电影的评分为5?
    
   
    
   
已经确定了人物、电影、和他们的关系,也确定了用户。
    关系应该是:进行评级
    
     RATED
    
   
    关系属性应该是:评分的值
    
     rating
    
   
    
    
    
     4.4建立更多关系代码
    
   
MATCH (sandy:User {name: 'Sandy Jones'})
MATCH (clinton:User {name: 'Clinton Spencer'})
MATCH (apollo:Movie {title: 'Apollo 13'})
MATCH (sleep:Movie {title: 'Sleepless in Seattle'})
MATCH (hoffa:Movie {title: 'Hoffa'})
MERGE (sandy)-[:RATED {rating:5}]->(apollo)