Neo4j从入门到放弃

前言

本文记录前公司在开发社交应用时,探索Neo4j数据库记录的一些关键信息和常见问题。希望这篇文章的一些信息能对你有所帮助。少走一些弯路。Neo4j的学习最好在搭建完后,它的web管理界面有一个引导教程,跟着它的指导手册走下教程,他的教程简单易懂,是不错的入门引导教程。关注本人的公众号:鲁班曰

概述

Neo4j is the world’s leading graph database. The architecture is designed for optimal management, storage, and traversal of nodes and relationships.
The graph database takes a property graph approach, which is beneficial for both traversal performance and operations runtime

Neo4j 是世界领先的图数据库。 该架构旨在优化管理、存储、节点和关系的遍历。 图数据库采用属性图方式,对遍历性能和操作运行时间这两个方面能获取不错的收益。

环境搭建

  1. jdk环境配置
  2. Neo4j解压安装
  3. neo4j start即可
    默认web端口7474 默认账号密码neo4j/neo4j
    服务器连接端口7687

基本概念

节点:表示某个领域的实体
关键点:

  1. 节点经常被表示为实体或者离散对象,节点可以被0个或多个标签归类
  2. 数据存储在节点的属性中
  3. 属性是简单的键值对
    标签:通过将节点分组为集合来构造特定领域
    关键点
  4. 一个节点可以有0到多个标签
  5. 标签被用于归类节点
    关系:连接两个节点
    关键点
  6. 关系总是有一个方向
  7. 关系总是有一个类型(type),(其实这个type就是标签名,这个也是自己的理解)
  8. 关系形成数据模式和图的结构
    属性:添加性质到节点和关系的命名值。
    在这里插入图片描述

命名规范

这个是Node label、Relationship type、property的官方命名规范
在这里插入图片描述

Neo4j相关工具介绍

Neo4j Desktop

Neo4j Desktop is a client application to help you work with Neo4j, whether you are just getting started or have prior experience. It is designed to help you as a new user to learn and experiment with Neo4j locally by including everything you need to get started. Once you know Neo4j, Desktop becomes your local development environment for projects where you will use Neo4j. With Neo4j Desktop, you can create any number of local databases as supported by the resources of your machine

Neo4j Desktop 是一个客户端应用程序,可帮助您使用 Neo4j,无论您是刚入门还是有经验。 它旨在帮助您作为新用户在本地学习和试验 Neo4j,包括您开始所需的一切。 一旦您了解了 Neo4j,Desktop 就会成为您将使用 Neo4j 的项目的本地开发环境。 使用 Neo4j Desktop,您可以根据您的机器资源创建任意数量的本地数据库

个人感觉这个就是好处就是可以下载插件,因为我目前还不知道插件去哪里下载,其他没什么鸟用,操

GraphGist

Building a graph of your data is fairly simple as the graph structure represents the real world much better than columns and rows of data. GraphGists are teaching tools which allow developers to explore how data in a particular domain would be modeled as a graph and see some example queries of that graph data
构建数据图表相当简单,因为图表结构比数据的列和行更能代表现实世界。 GraphGists 是一种教学工具,允许开发人员探索如何将特定领域中的数据建模为图,并查看该图数据的一些示例查询

NeoDash

NeoDash is an open-source, low-code Dashboard Builder for Neo4j. It lets you build an interactive dashboard with tables, graphs, bar charts, line charts, maps and more.

NeoDash 是用于 Neo4j 的开源、低代码仪表板生成器。 它使您可以使用表格、图形、条形图、折线图、地图等构建交互式仪表板

Cypher语言

Neo4j的图查询语言
Neo4j的Cypher语言专为处理图数据而构建

  • 使用模式来描述图数据
  • 熟悉的类似SQL的语句
  • 声明性的,描述要查找的内容,而不是如何查找

create

在这里插入图片描述

MATCH (ee:Person) WHERE ee.name = 'Emil'
CREATE (js:Person { name: 'Johan', from: 'Sweden', learn: 'surfing' }),
(ir:Person { name: 'Ian', from: 'England', title: 'author' }),
(rvb:Person { name: 'Rik', from: 'Belgium', pet: 'Orval' }),
(ally:Person { name: 'Allison', from: 'California', hobby: 'surfing' }),
(ee)-[:KNOWS {since: 2001}]->(js),(ee)-[:KNOWS {rating: 5}]->(ir),
(js)-[:KNOWS]->(ir),(js)-[:KNOWS]->(rvb),
(ir)-[:KNOWS]->(js),(ir)-[:KNOWS]->(ally),
(rvb)-[:KNOWS]->(ally)

上面的语句包含查询和创建节点和创建关系,而且是创建多条

match

在这里插入图片描述

删除节点delete,不能删除含有关系的节点

MATCH(p:Person) DELETE p;

导入数据

Neo4j 有许多强大的数据加载选项,无论是用于
在线导入的多功能 LOAD CSV Cypher命令、
用于其他格式的 APOC 程序,
还是用于快速引导完整数据库的 neo4j-admin 导入
这些工具虽然功能强大,但具有学习曲线,当您刚开始时可能会妨碍您
所以可以使用Neo4j Data Importer一个小巧但功能强大的无代码 UI,用于将平面文件数据加载到 Neo4j 数据库中,地址如下

默认导入数据文件存放文件夹位置,可以通过配置修订
在这里插入图片描述

如果导入的数据非常多,可以通过使用周期提交
在这里插入图片描述

默认1000条记录提交一次,也可以自己设置

在这里插入图片描述

学习案例

First Steps with Cypher

通过这个案例能学习shotestPath函数,还有*…5这个操作

Northwind Recommendation Engine

基于内容的推荐
match (c:Customer)-[:PURCHASED]->(o:Order)-[:PRODUCT]->(p:Product)
<-[:PRODUCT]-(o2:Order)-[:PRODUCT]->(p2:Product)-[:PART_OF]->(:Category)<-[:PART_OF]-(p)
WHERE c.customerID = 'ANTON' and NOT( (c)-[:PURCHASED]->(:Order)-[:PRODUCT]->(p2) )
return c.companyName, p.productName as has_purchased, p2.productName as has_also_purchased, count(DISTINCT o2) as occurrences
order by occurrences desc
limit 5

我们可以为客户做出的最简单的推荐是基于内容的推荐。 根据他们以前的购买情况,我们可以向他们推荐他们尚未购买的任何东西吗? 对于我们的客户购买的每种产品,让我们看看其他客户也购买了什么。 每个 :Product 都与一个 :Category 相关,因此我们可以使用它来进一步缩小要推荐的产品列表

  1. 用户购买的商品p
  2. 该商品被其他订单购买
  3. 其他订单还买了什么商品P2
  4. 且其他商品p2和用户购买的商品p同属一个类别
  5. 其他商品p2用户还没买过
Collaborative Filtering(协同过滤
MATCH (c:Customer)-[:PURCHASED]->(o:Order)-[:PRODUCT]->(p:Product)
WITH c, count(p) as total
MATCH (c)-[:PURCHASED]->(o:Order)-[:PRODUCT]->(p:Product)
WITH c, total,p, count(o)*1.0 as orders
MERGE (c)-[rated:RATED]->(p)
ON CREATE SET rated.rating = orders/total
ON MATCH SET rated.rating = orders/total
WITH c.companyName as company, p.productName as product, orders, total, rated.rating as rating
ORDER BY rating DESC
RETURN company, product, orders, total, rating LIMIT 10
  1. 获取每个客户购买商品总数
  2. 获取每个客户每个商品的购买数量
  3. 商品购买数量/商品总数得到分数rating
  4. 并创建客户到商品的关系©-[rated:RATED]->§

查询调优

基本的查询优化案例

MATCH (p {name: 'Tom Hanks'}) RETURN p

这里没有加label,会对所有node进行扫描

所有加如下

MATCH (p:Person {name: 'Tom Hanks'}) RETURN p

进一步优化就是给name加索引

CREATE INDEX FOR (p:Person) ON (p.name)

高级查询优化案例

  1. 通过 profile分析发现,name是直接从索引获取的
PROFILE MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
   WHERE p.name STARTS WITH 'Tom'
   RETURN  p.name AS name,  count(m) AS count
  1. 如果我们改变上面的查询,如下
PROFILE MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
RETURN  p.name AS name,  count(m) AS count

这个时候name并没有从缓存中获取,再次访问数据库才获取到name

如何解决这个问题

使用Predicates可以启用优化

  • Existence (e.g. WHERE n.name IS NOT NULL)
  • Equality (e.g. WHERE n.name = ‘Tom Hanks’)
  • Range (e.g. WHERE n.uid > 1000 AND n.uid < 2000)
  • Prefix (e.g. WHERE n.name STARTS WITH ‘Tom’)
  • Suffix (e.g. WHERE n.name ENDS WITH ‘Hanks’)
  • Substring (e.g. WHERE n.name CONTAINS ‘a’)
  • Several predicates of the above types combined using OR, given that all of them are on the same property (e.g. WHERE n.prop < 10 OR n.prop = ‘infinity’)

还有一种方式就是创建约束,(这个要求企业版才有的特性,对我没用)

CREATE CONSTRAINT constraint_name FOR (p:Person) REQUIRE p.name IS NOT NULL

之后不使用Predicates也可以触发优化

聚合函数

除了上面加Predicates外,我们也可以通过聚合函数达到优化的目的如下

PROFILE
MATCH (p:Person)
RETURN count(DISTINCT p.name) AS numberOfNames

在这种情况下,聚合函数的语义就像隐式存在predicate一样工作,因为没有属性名称的 Person 节点不会影响聚合的结果

约束

创建约束的同时也是创建索引

CREATE CONSTRAINT constraint_name FOR (book:Book) REQUIRE book.isbn IS UNIQUE

索引

创建索引

CREATE INDEX node_index_name FOR (n:Person) ON (n.surname)

显示索引列表

SHOW INDEXES

删除索引

DROP INDEX index_name

自定义Procedures和Functions

最好先看下plugins目录下的README.txt文件
User Defined Procedures and Functions
Extending Neo4j

Springboot应用连接Neo4j和crud操作示例

Spring Data Neo4j

常见问题

时间不对处理

在使用Neo4j的时候发现其日志中时间非东八区时间,修改配置文件指定使用当前系统时间即可
dbms.db.timezone=SYSTEM

在这里插入图片描述

无法远程访问browser的问题处理,修改配置如下

在这里插入图片描述

SpringBoot开启Neo4j语句日志打印

logging.level.org.springframework.web=debug
logging.level.org.neo4j.ogm=debug
logging.level.org.springframework.data.neo4j=debug
logging.level.org.neo4j.driver.GraphDatabase=debug

logging.level.org.neo4j.driver.OutboundMessageHandler=debug
logging.level.org.neo4j.driver.InboundMessageDispatcher=debug

忘记密码如何处理

参考文献

Neo4j document
Extending Neo4j
Cypher语言参考手册
常见问题
Difference between Function and Procedure
Spring Data Neo4j
Example Project
Query Tuneing
如何理解predicate这个词?
Index-free adjacency
试卷样例
Importing CSV Data into Neo4j
:auto using periodic和 using periodic
Neo4j-OGM Object到图实体的映射

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值