焦小花同学

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:

13    result = session.run(“MATCH (n) RETURN n LIMIT 10”)

14    for record in result:

15        print(record)

温馨提示 :记得要把password改成你自己的密码,不然会连不上哦!

上面的代码做了啥?我们先是连上了数据库,然后写了一条非常简单的Cypher查询(Cypher是Neo4j的查询语言),它的意思是:找到数据库中的前10个节点。

2.

创建节点和关系

连接上数据库后,我们当然要往里面存点数据。我们来创建两个节点(假设是两个人)和它们之间的关系。    

1with driver.session() as session:

2    session.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:

2    result = session.run(“MATCH (a:Person)-[:KNOWS]->(b:Person) RETURN a, b”)

3    for record in result:

4        print(f“{record['a']['name']} knows {record['b']['name']}”)

这里的MATCH就像SQL里的SELECT,它的意思是:找到所有Person节点,并且它们之间有KNOWS关系。然后我们把查询结果打印出来,看看Alice是不是认识Bob。

4.

使用参数化查询

在实际应用中,很多时候我们需要动态传递参数,Neo4j也支持这种参数化查询。这样不仅可以避免写死数据,还能防止SQL注入攻击类似的问题。    

1def create_person(name):

2    with driver.session() as session:

3        session.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:

2    result = 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    )

7    for record in result:

8        print(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适合用在哪些场景呢?其实,图数据库的应用场景非常广泛。一般来说,它特别适合处理那些实体之间关系复杂、且关系查询频繁的场景。举几个例子:

  • 社交网络 :用户之间的好友关系、关注关系等

  • 推荐系统 :根据用户的兴趣、朋友的喜好推荐内容

  • 路径优化 :比如城市交通网络中的最短路径计算

  • 欺诈检测 :通过分析交易网络中的可疑模式来发现欺诈行为

只要是关系复杂、链路深的数据分析场景,图数据库都能派上用场。

别忘了点

Image

分享、

Image

收藏、

Image

在看、

Image

点赞

哦!