开发者学堂课程【高校精品课-上海交通大学-企业级应用体系架构:Neo4J 1】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/75/detail/15850
Neo4J 1(三)
内容介绍:
一、Neo4J and RockDB
二、What is a Graph?
三、Graph Database
四、Options for Storing Connected Date
五、Data Modeling with Graphs
六、Building a Graph Database Application
七、总结
六、Building a Graph Database Application
1、明白它的优势之后,剩下的要去使用它。
· Describe the Model in Terms of th e Application's Needs
· Here's an example of a user story for r a book review web application:
- AS Areader who likes a book,I WANT to know which books other readers who like the same book have liked, so THAT I can find other books to read.
要去设计图数据库,看到哪一些是节点,节点之间应该有怎样的关系?在下图的节点中,
在这样四个节点构成的关系中可以看到,可以问 Alice 喜欢什么样的书?对于叫 Alice 的人,他喜欢 Dune 这本书,有多少跟 Alice 一样喜欢这本书的人?看看那些人,他们喜欢什么书?就可以把这些书推荐给Alice。
- since Alice likes Dune, find books that others who like Dune have enjoyed:
MATCH(:Reader {name:'Alice'})-[:LIKES]->(:Book {title:'Dune'})
<-[:LIKES]-(:Reader)-[:LIKES]->(bool ks:Book)
RETURN books.title
Reader 是 Alice,他喜欢的书是 Dune,想给 Alice推荐其他的书的想法是同样喜欢这本书的人,还喜欢看什么书,把这个书推荐给 Alice。就是所谓的协同过滤,有相同的爱好的话,一定会喜欢我喜欢的其他东西。Alice 喜欢这本书,这本书还有其他的人喜欢关系就返过来了,他们喜欢的书有哪些?把这些书的名字返回。在图数据库中是怎样描述这个模型的,是按照需求来描述查询的语句。
2、在图数据库中有实体的东西是节点,节点和节点之间的关系用 vn 来描述,描述两个节点之间存在一定关系,关系的方向一般都是有向的,它的方向再进一步澄清有没有关系的语义,到底是人喜欢书还是书喜欢人,方向要搞清楚。这些关系不止一个,可以有多个,但是如果方向是双向对等的,也可以用无向边来表示,就不用两个有向的关系来表示了。节点的属性就是一些实体的属性,比如人要有名字等等;关系的属性就是进一步支出和其他关系的差异,有权重来表示这个关系比其他关系更轻一些或更重要一些,这是在设计时候的依据。
Nodes for Things, Relationships for Structure
- Use nodes to represent entities that is,the things in our domain that are of interest to us, and which can be labeled and grouped.
- Use relationships both to express the connections between entities and to establish semantic context for each entity,thereby structuring the domain.
-Use relationship direction to further clarify relationship semantics. Many relationships are asymmetrical, which is why relationships in a property graph are always directed. For bidirectional relationships we should make our queries ignore direction, rather than using two relationships.
- Use node properties to represententity attributes, plus any necessary entity metadata,such as timestamps,version numbers,etc.
- Use relationship properties to express the strength,weight,or quality of a relationship,plusany necessary relationship metadata, such as timestamps, version numbers, etc
3、下面是一些例子,怎样去建模?
Model Facts as Nodes
Employment
- The Figure shows how the fact of lan being employed by Neo Technology in the role of engineer can be repre sented in the graph.
一些事实把它建模成节点,比如说在雇佣关系里面,Neo 这个公司雇佣了 lan 这个人,给了他一个工程师的角色,这三者之间是通过一个叫 job 的对象产生关系,就表达了 lan 这个人是在中间那个时间雇佣的,他的雇主是 Neo,他受雇的角色是工程师,有了这样一个描述之后,就写出了下面的语句。
CREATE(:Person{name:'lan'})-[:EMPLOY MENT]->
(employment:Job
{start_date:'2011-01-05'})-[:EMPLOYER] ->(:Company {name:'Neo'}),
(employment)-[:ROLE]->(:Role {name:'er ngineer'})
创建一个人,这个人的名字叫 lan,有一个雇佣关系,得到了雇佣类型的 job,时间是 2011-01-05,job 的雇主关系是 Neo,给他的角色是工程师,这是描述上图的结构。
4、下面是一个类似的,就不再仔细讲解了。
真正的 Neo4J 在跑的时候,可以在一个集群里跑,前面加一个负载均衡器。也可以做一个叫 Embedded,启用服务器的时候,可以把它嵌入跑,这是一个具体的运行方式。
七、总结
为什么搜索起来比较快,这要进到数据库里面看,看他的存储机制是怎样的?本节课讲的例子可以跑,前提是必须安装 neo4j,装好 neo4j 之后启动项目才能跑起来。跑起来之后,如果能看到库里面的内容,有三个人之间的关系,会画一张图,例子跑出来的样子如下图。
下个课程会讲大数据相关的内容,大数据相关的内容会用到 jupyter notebook,提前安装。他是基于 python,先装python,再装 jupyter notebook,这样这些东西才能跑起来。
item 存到 order 里是有一个缺陷的,这个缺陷实际上是 item 会有冗余,比如说两个order,他们俩的东西是一个,item 可能就会有冗余,刚才图的设计就是希望减少 item 的冗余,如果碰到 item 会被若干个 order 引用的话只有一个。