Neo4j是一个高性能的图形数据库,它将结构化数据存储在网络上而不是表中,因其具有嵌入式、高性能、轻量级等优势,越来越受到人们关注。我们以Neo4j为例进行讲解。编写我们的第一个有向图程序,完整演示代码请见本书GitHub上的13-1.py。
1.neo4j安装
在https://neo4j.com/ 上下载安装包进行安装,默认配置即可。
2.ne04j启动
以我的mac为例子,通过gui启动,启动界面如图13-3所示,默认密码为ne04j/ne04j,第一次登录会要求更改密码。
图13-3 neo4j启动界面
启动管理界面见图13-4。
图13-4 neo4j管理界面
3.SDK安装
Python API库安装:
sudo pip install neo4j-driver
下载JPype:
https://pypi.python.org/pypi/JPype1
安装JPype:
tar -zxvf JPype1-0.6.2.tar.gz cd JPype1-0.6.2 sudo python setup.py install
4.导入数据
微博关注关系如图13-5所示。
图13-5 微博关注关系图
假设要将上面的微博好友关系导入数据库。
导入库并连接数据库:
from neo4j.v1 import GraphDatabase, basic_auth driver = GraphDatabase.driver("bolt://localhost", auth=basic_auth("neo4j", "maidou")) session = driver.session()
插入人物节点以及关注关系数据:
insert_query = ''' UNWIND {pairs} as pair MERGE (p1:Person {name:pair[0]}) MERGE (p2:Person {name:pair[1]}) MERGE (p1)-[:KNOWS]-(p2); ''' data = [["Jim","Mike"],["Jim","Billy"],["Anna","Jim"], ["Anna","Mike"],["Sally","Anna"],["Joe","Sally"], ["Joe","Bob"],["Bob","Sally"]] session.run(insert_query, parameters={"pairs": data})
5.查询数据
查询1:
foaf_query = ''' MATCH (person:Person)-[:KNOWS]-(friend)-[:KNOWS]-(foaf) WHERE person.name = {name} AND NOT (person)-[:KNOWS]-(foaf) RETURN foaf.name AS name ''' results = session.run(foaf_query, parameters={"name": "Joe"}) for record in results: print(record["name"])
运行结果为:
B0000000B60544:code liu.yan$ python 13-1.py Anna
查询2:
common_friends_query = """ MATCH (user:Person)-[:KNOWS]-(friend)-[:KNOWS]-(foaf:Person) WHERE user.name = {user} AND foaf.name = {foaf} RETURN friend.name AS friend """ results = session.run(common_friends_query, parameters={"user": "Joe", "foaf": "Sally"}) for record in results: print(record["friend"])
查询结果为:
B0000000B60544:code liu.yan$ python 13-1.py Bob
查询3:
connecting_paths_query = """ MATCH path = shortestPath((p1:Person)-[:KNOWS*..6]-(p2:Person)) WHERE p1.name = {name1} AND p2.name = {name2} RETURN path """ results = session.run(connecting_paths_query, parameters={"name1": "Joe", "name2": "Billy"}) for record in results: print (record["path"])
结果为:
B0000000B60544:code liu.yan$ python 13-1.py <Path start=7 end=16 size=4>
6.可视化展现
可视化可以分两点:1)展示原始数据,2)展示关联关系。
Neo4j原始数据如图13-6所示。
图13-6 neo4j原始数据图
Neo4j关联关系如图13-7所示。
图13-7 Neo4j关联关系可视化图