Neo4j数据建模教程

  • Post author:
  • Post category:其他




Neo4j进行数据建模

1.本教程适合学习了neo4j基本增删改查语法后进行学习

2.如果还不熟悉语法,本人非常详细的增删改查教程连接如下

3.学习本教程之后可以学习:

Neo4j 全网最详细教程


python对neo4j的api接口框架py2neo进阶教程:

py2neo框架学习全网最详细教程



1.学习资料



网站



2.开始简介



2.1图形数据建模(Graph Data Modeling)



neo4j的组成部分

  • 节点
  • 标签
  • 关系
  • 性能



数据建模过程

  • 1.了解领域并定义特定的用例,枚举用例
  • 2.开发初始图形数据模型

    • 对节点(实体)建模
    • 对关系建模
  • 3.对初始数据测试模型
  • 4.使用cypher创建图形实例
  • 5.测试性能,定义的模型是否满足需求
  • 6.如果由于用例更改或者性能原因,进行重构图形数据模型
  • 7.重构后使用Cypher重新测试

图形数据建模是一个迭代过程。初始图形数据模型是一个起点,但随着了解有关用例的更多信息,或者如果用例发生更改,初始图形数据模型将需要更改。

此外,您可能会发现,特别是当图形缩放时,您需要修改图形(

重构

)以实现关键用例的最佳性能。



2.2数据领域(The Domain)

在数据建模过程中我们必须

  • 描述具体项目的细节
  • 确定用户和系统
  • 对用例达成一致看法

    • 用例就是具有哪些查询功能
  • 枚举用例



电影领域



Neo4j基础

课程中,向您介绍了一个“入门”电影图。

该域名包括电影、演戏或执导电影的用户以及为电影评分的用户。使此域有趣的是图中节点之间的连接或关系。



使用案例

知识图谱项目的大多数用例都可以通过全面的问题列表来枚举。这些用例有助于定义知识图谱在运行时的行为方式。

以下是您将用于开发初始图形数据模型的用例:

  1. 电影中有哪些人表演?
  2. 谁导演了一部电影?
  3. 一个人出演了什么电影?
  4. 有多少用户对一部电影进行了评分?
  5. 谁是最年轻的电影演员?
  6. 一个人在电影中扮演了什么角色?
  7. 根据imDB的数据,特定年份收视率最高的电影是什么?
  8. 演员出演了哪些戏剧电影?
  9. 哪些用户给电影打了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(根据用例确定关系属性模型)


一个人



某部电影



扮演

了什么角色?

  1. 检索人员的姓名。
  2. 遵循与电影ACTED_IN关系。
  3. 按影片标题筛选影片。
  4. 从两个节点之间的ACTED_IN关系中返回

    角色


构建数据模型

在这里插入图片描述


构建数据模型的实力模型

Instance model




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)



版权声明:本文为qq_42644523原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。