1.本教程适合学习了neo4j基本增删改查语法后进行学习
2.如果还不熟悉语法,本人非常详细的增删改查教程连接如下
3.学习本教程之后可以学习:Neo4j 全网最详细教程
python对neo4j的api接口框架py2neo进阶教程:py2neo框架学习全网最详细教程
图形数据建模是一个迭代过程。初始图形数据模型是一个起点,但随着了解有关用例的更多信息,或者如果用例发生更改,初始图形数据模型将需要更改。
此外,您可能会发现,特别是当图形缩放时,您需要修改图形(重构)以实现关键用例的最佳性能。
在数据建模过程中我们必须
在Neo4j基础课程中,向您介绍了一个“入门”电影图。
该域名包括电影、演戏或执导电影的用户以及为电影评分的用户。使此域有趣的是图中节点之间的连接或关系。
知识图谱项目的大多数用例都可以通过全面的问题列表来枚举。这些用例有助于定义知识图谱在运行时的行为方式。
以下是您将用于开发初始图形数据模型的用例:
电影、演员、导演、用户四个类型的节点。
在我们的领域中,我们希望区分出演或执导电影的人和为电影评分的用户或评论者。我们有更多关于人们的信息,例如他们的出生日期,他们的tmdbId等。对电影进行评级的用户将被命名或识别。
为应用程序执行图形数据建模过程时,至少需要两种类型的模型:数据模型、实例模型
实体是用例中的主要名词:食谱、成分、人、电影…
食谱中使用了哪些成分?谁嫁给了这个人?
电影中有哪些人表演?谁导演了一部电影?一个人出演了什么电影?
MATCH (p:Person {name: 'Tom Hanks'})-[:ACTED_IN]-(m:Movie) RETURN m
MATCH (p:Person)-[:ACTED_IN]-(m:Movie {title: 'Apollo 13'})-[:RATED]-(u:User) RETURN p,u
MATCH (p:Person {name: 'Tom Hanks'})-[:ACTED_IN]-(m:Movie) RETURN m.title, m.released
以下是我们将为 Movie 节点定义的属性:
- 电影标题(字符串)- 电影上映(日期)- 电影评级(0-10 之间的十进制)- 电影流派(字符串列表)
以下是我们将为 Person 节点定义的属性:
- Person.name(字符串)- 出生人(日期)- 逝世人(日期)
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
关系是实体之间的连接**,连接是用例中的**谓词:
全字母大写
Neo4j 中创建关系时,必须显式指定方向(代码从左到右写)
在运行时,在查询期间,通常不需要方向。
人可以有姓名属性,出生日期属性,但为了满足用例需求,可将姓、名、出生日期作为节点拿出来
例如,如果用例中存在满足某种条件的人物的姓氏是什么?
可以将属性添加到关系中以进一步描述关系,如结婚关系的日期属性,工作关系的角色属性
以下是一些用例
那么关系就是
所以数据模型为
支持数据模型的实例模型
一个人在某部电影中扮演了什么角色?
构建数据模型
构建数据模型的实力模型
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)
我们需要为新的用例重构模型:用例:哪些用户给电影的评分为5?
已经确定了人物、电影、和他们的关系,也确定了用户。
关系应该是:进行评级 RATED
关系属性应该是:评分的值 rating
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)