之前遇到过一些场景需要采用到图数据库进行存储比较合适,于是最近调研了下neo4j的使用方式,使用本文来记录下初次使用neo4j进行学习的过程。
Neo4j的安装
这里由于只是本地电脑(mac m2)部署进行学习,所以我只使用了docker进行运作,下边是一段简单的docker运行命令:
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/neo4j:3.5.26
docker run -it -d -p 7474:7474 -p 7687:7687 swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/neo4j:3.5.26
Neo4j的基本概念
CQL
我在初次接触到neo4j的sql语法的时候 感觉它和prometheus的sql语法都有一个共同点,就是很反人类。neo4j的sql官方说法叫做cql(CypherQueryLanguage),是一种加密查询语言。
**节点
**
在图数据库中,节点就有些类似于关系型数据库中行的概念。
关系
节点和节点直接可以有链接关系,对于这些关系你可以加上一些自定义的标签属性的。
社交关系案例实践
下边我们通过一组简单的实践来学习下neo4j的使用。
假设我们有一个社交网络系统,您可以使用 neo4j 来存储和查询用户之间的关系。我们以“用户-关注-用户”的关系为例来说明。
首先当一个用户注册了某款社交APP后,我们可以尝试将它的用户数据写入到neo4j中。例如Alice,Bob等多个用户被写入到neo4j中。
CREATE (:User {name:'Alice'})
CREATE (:User {name:'Bob'})
CREATE (:User {name:'Jack'})
CREATE (:User {name:'Tim'})
CREATE (:User {name:'Mark'})
创建成功后,可以尝试查询下数据:
match (u:User) return u
返回效果在neo4j的查询控制台上,你会看到出现了多个用户的节点
接着,我们模拟各个同学之间的关系行为:
MATCH (a:User), (b:User) WHERE a.name = "Alice" AND b.name = "Bob" CREATE (a)-[r:follow]->(b) RETURN a,b
MATCH (a:User), (b:User) WHERE a.name = "Alice" AND b.name = "Jack" CREATE (a)-[r:follow]->(b) RETURN a,b
MATCH (a:User), (b:User) WHERE a.name = "Tim" AND b.name = "Bob" CREATE (a)-[r:follow]->(b) RETURN a,b
关于 [:follow] 的含义,它表示了两个节点之间的关系。在neo4j中,我们使用方括号来表示两个节点之间的关系,方括号中的文本就是关系的类型,例如在这个例子中,follow 是关系的一个标签,这个名称是可以自定义的,你可以叫follow或者followed都可以,它只是一个标签而已。
执行上述sql之后,你会发现各个节点之间都建立了相关的好友联系:
这个时候,如果我们想查询Alice同学所关注的人员清单的话,可以执行以下sql:
MATCH (u:User {name: 'Alice'})-[:follow]->(follower)RETURN u, follower
最后如果想要查询出两个人之间的共同好友的话,可以采用下边这段sql执行。
MATCH (user1:User)-[:follow]->(commonFollowed:User)<-[:follow]-(user2:User) WHERE user1 <> user2RETURN user1.name AS user1,user2.name AS user2,commonFollowed.name AS commonFollowed
这里会展示一个表格的数据出来,显示出Alice和Tim有个共同的好友Bob
如果这里你希望做更复杂一些的产讯,例如查询某个用户关注者所关注的其他用户,例如下图关系链中,Bob和Alice互相关注,此时Tim作为Bob的粉丝,希望能知道Bob还关注了谁。
我们可以执行以下sql
MATCH (u:User {name: 'Tim'})-[:follow]->(:User)-[:follow]->(follower)RETURN follower
于是这里便会返回Bob所关注的人Alice出来,如下图所示:
好了,看到这里相信你已经对neo4j入门有一个基本的了解了,那么接下来建议可以再去找些资料进行深入学习与了解。看到这里,希望本文能对你有所帮助。