Neo4j,用Python探索图数据库的奥秘!
点击
上方文字
关注我们
今天聊聊一个不怎么常见、但却很有意思的数据库— 图数据库。你可能已经接触过SQL、MongoDB这些关系型和非关系型数据库,但图数据库是一种有点特别的存在。今天我们用Python来探索一下Neo4j,这个专门处理图数据的数据库。
Neo4j是啥?简单来说,图数据库就是把数据看成一堆“点”和“边”,点代表实体,边代表实体之间的关系。它非常适合处理社交网络、推荐系统、路径优化等问题。
那我们接下来就一起看看,怎么用Python去操作Neo4j吧!
1.
连接Neo4j数据库
当然是连上Neo4j数据库。我们需要用到一个叫neo4j的Python库。
1pip install neo4j
接着,我们需要启动Neo4j数据库。如果你还没装Neo4j,可以去官网下载(Neo4j官网),或者用Docker来快速启动一个Neo4j容器。
一旦Neo4j跑起来了,我们就可以用Python代码连接上它。
1from neo4j import GraphDatabase
3# 替换成你的Neo4j地址和认证信息
4uri = “neo4j://localhost:7687”
5username = “neo4j”
6password = “password”
8# 建立连接
9driver = GraphDatabase.driver(uri, auth=(username, password))
11# 创建一个会话
12with driver.session() as session:
13result = session.run(“MATCH (n) RETURN n LIMIT 10”)
14for record in result:
15print(record)
温馨提示 :记得要把password改成你自己的密码,不然会连不上哦!
上面的代码做了啥?我们先是连上了数据库,然后写了一条非常简单的Cypher查询(Cypher是Neo4j的查询语言),它的意思是:找到数据库中的前10个节点。
2.
创建节点和关系
连接上数据库后,我们当然要往里面存点数据。我们来创建两个节点(假设是两个人)和它们之间的关系。
1with driver.session() as session:
2session.run(
3“CREATE (a:Person {name: 'Alice'}) ”
4“CREATE (b:Person {name: 'Bob'}) ”
5“CREATE (a)-[:KNOWS]->(b)”
6)
看起来Neo4j的Cypher语言有点像SQL,但又不完全一样。上面这段Cypher的意思是:
创建一个叫Alice的节点,标签是
Person创建一个叫Bob的节点,标签也是
Person创建一个关系,表示Alice认识Bob,用
KNOWS来标记这个关系
温馨提示 :Neo4j中的节点是用()表示的,边(关系)是用-[]-表示的,挺好记的吧?
3.
查询节点和关系
现在我们再来查一下刚刚创建的数据,看看存进去了没。
1with driver.session() as session:
2result = session.run(“MATCH (a:Person)-[:KNOWS]->(b:Person) RETURN a, b”)
3for record in result:
4print(f“{record['a']['name']} knows {record['b']['name']}”)
这里的MATCH就像SQL里的SELECT,它的意思是:找到所有Person节点,并且它们之间有KNOWS关系。然后我们把查询结果打印出来,看看Alice是不是认识Bob。
4.
使用参数化查询
在实际应用中,很多时候我们需要动态传递参数,Neo4j也支持这种参数化查询。这样不仅可以避免写死数据,还能防止SQL注入攻击类似的问题。
1def create_person(name):
2with driver.session() as session:
3session.run(“CREATE (a:Person {name: $name})”, name=name)
5create_person(“Charlie”)
6create_person(“David”)
这里我们用$name来作为参数占位符,session.run的第二个参数是一个字典(或者用关键字参数),用来传递实际的值。
温馨提示 :参数化查询是个好习惯,不仅更安全,还能提高代码的可读性。
5.
复杂查询:推荐朋友
有了基本的CRUD操作后,我们可以尝试一些更复杂的查询。比如,现在我们想实现一个社交网络中的“推荐朋友”的功能。假设Alice认识Bob,Bob认识Charlie,那我们应该推荐Charlie给Alice。
1with driver.session() as session:
2result = session.run(
3“MATCH (a:Person)-[:KNOWS]->(b:Person)-[:KNOWS]->(c:Person) ”
4“WHERE a.name = $name AND NOT (a)-[:KNOWS]->(c) ”
5“RETURN c.name AS recommended_friend”, name=“Alice”
6)
7for record in result:
8print(f“Alice, you may know: {record['recommended_friend']}”)
上面的Cypher语句的意思是:
先找到Alice的朋友Bob(
(a)-[:KNOWS]->(b))再找到Bob的朋友Charlie(
(b)-[:KNOWS]->(c))但前提是Alice还不认识Charlie(
NOT (a)-[:KNOWS]->(c))
这样我们就可以给Alice推荐新的朋友啦!是不是很简单?
6.
图数据库的应用场景
说了这么多,Neo4j适合用在哪些场景呢?其实,图数据库的应用场景非常广泛。一般来说,它特别适合处理那些实体之间关系复杂、且关系查询频繁的场景。举几个例子:
社交网络 :用户之间的好友关系、关注关系等
推荐系统 :根据用户的兴趣、朋友的喜好推荐内容
路径优化 :比如城市交通网络中的最短路径计算
欺诈检测 :通过分析交易网络中的可疑模式来发现欺诈行为
只要是关系复杂、链路深的数据分析场景,图数据库都能派上用场。
别忘了点
分享、
收藏、
在看、
点赞
哦!