Neo4j:快速上手Neo4j,安装,Web客户端和Shell使用,Python操作neo4j

摘要:Neo4jPython

Neo4j下载安装

在Ubuntu系统下联网直接使用curl下载压缩包

 curl -O http://dist.neo4j.org/neo4j-community-3.4.5-unix.tar.gz

移动目录并解压

root@ubuntu:~# mv neo4j-community-3.4.5-unix.tar.gz /opt
root@ubuntu:/opt# tar -axvf neo4j-community-3.4.5-unix.tar.gz

修改配置文件

root@ubuntu:/opt/# cd neo4j-community-3.4.5/conf
root@ubuntu:/opt/neo4j-community-3.4.5/conf# vim neo4j.conf

对如下内容进行修改

# 修改第22行load csv时l路径,在前面加个#,可从任意路径读取文件
#dbms.directories.import=import

# 修改35行和36行,设置JVM初始堆内存和JVM最大堆内存
# 生产环境给的JVM最大堆内存越大越好,但是要小于机器的物理内存
dbms.memory.heap.initial_size=5g
dbms.memory.heap.max_size=10g

# 修改46行,可以认为这个是缓存,如果机器配置高,这个越大越好
dbms.memory.pagecache.size=10g

# 修改54行,去掉改行的#,可以远程通过ip访问neo4j数据库
dbms.connectors.default_listen_address=0.0.0.0

# 默认 bolt端口是7687,http端口是7474,https关口是7473,不修改下面3项也可以
# 修改71行,去掉#,设置http端口为7687,端口可以自定义,只要不和其他端口冲突就行
#dbms.connector.bolt.listen_address=:7687

# 修改75行,去掉#,设置http端口为7474,端口可以自定义,只要不和其他端口冲突就行
dbms.connector.http.listen_address=:7474

# 修改79行,去掉#,设置https端口为7473,端口可以自定义,只要不和其他端口冲突就行
dbms.connector.https.listen_address=:7473

# 修改227行,去掉#,允许从远程url来load csv
dbms.security.allow_csv_import_from_file_urls=true

# 修改246行,允许使用neo4j-shell,类似于mysql 命令行之类的
dbms.shell.enabled=true

# 修改235行,去掉#,设置连接neo4j-shell的端口,一般都是localhost或者127.0.0.1,这样安全,其他地址的话,一般使用https就行
dbms.shell.host=127.0.0.1

# 修改250行,去掉#,设置neo4j-shell端口,端口可以自定义,只要不和其他端口冲突就行
dbms.shell.port=1337

# 修改254行,设置neo4j可读可写
dbms.read_only=false

添加neo4j环境变量

root@ubuntu:/opt/neo4j-community-3.4.5/conf# vim ~/.bashrc
export PATH=$PATH:/opt/neo4j-community-3.4.5/bin
root@ubuntu:/opt/neo4j-community-3.4.5/conf# source ~/.bashrc

启动,停止,查看neo4j服务

root@ubuntu:~# neo4j start
Active database: graph.db
Directories in use:
  home:         /opt/neo4j-community-3.4.5
  config:       /opt/neo4j-community-3.4.5/conf
  logs:         /opt/neo4j-community-3.4.5/logs
  plugins:      /opt/neo4j-community-3.4.5/plugins
  import:       NOT SET
  data:         /opt/neo4j-community-3.4.5/data
  certificates: /opt/neo4j-community-3.4.5/certificates
  run:          /opt/neo4j-community-3.4.5/run
Starting Neo4j.
WARNING: Max 1024 open files allowed, minimum of 40000 recommended. See the Neo4j manual.
Started neo4j (pid 26458). It is available at http://0.0.0.0:7474/
There may be a short delay until the server is ready.
See /opt/neo4j-community-3.4.5/logs/neo4j.log for current status.
root@ubuntu:~# neo4j status
Neo4j is running at pid 26458
root@ubuntu:~# neo4j stop
Stopping Neo4j.. stopped
root@ubuntu:~# 

查看Web客户端打开http://0.0.0.0:7474/,配置文件中默认的http端口号是7474,第一次访问账号neo4j,密码neo4j,会提示修改初始密码


在Web客户端退出已经登陆的用户在命令区输入:server disconnect即可退出用户重新登陆

Web客户端使用

neo4j使用Web客户端作为管理平台,分为三个功能区,命令输入区状态工具栏结果显示区,在命令输入区需要输入Cypher语句进行图数据库的增删改查操作,下面先创建数据,并实现数据检索

(1)创建图数据

使用CREATE语句创建节点和关系,其中n:Person冒号后面的代表节点的标签,后面的Map代表节点的属性

CREATE (n:Person {name: '关羽', power: '蜀', force: 98})
CREATE (n:Person {name:'刘备', power: '蜀汉', force: 78})
CREATE (n:Person {name:'吕蒙', power: '孙吴', force: 76})
CREATE (n:Power {name:'蜀汉'})
CREATE (n:Person {name:'周瑜', power: '孙吴', force: 64})

此时通过MATCH语句返回所有的节点

MATCH (n) RETURN n

下一步创建关系,通过MATCH模式匹配到对应的节点对,为节点对通过CREATE创建关系,关系使用-表示,对于指向的第二个节点对象,使用->代表方向,neo4j在创建关系的时候必须指定方向,在检索关系的时候可以使用无向

MATCH ( a: Person ), ( b: Person ) 
WHERE a.name = "关羽" AND b.name = "刘备" 
CREATE ( a )-[ r: brother ]->( b ) 
RETURN a, b;

也可以给关系添加属性

MATCH ( a: Person ), ( b: Power )
WHERE a.name = "关羽" AND b.name = "蜀汉"
CREATE ( a )-[ r:role_in {name: '武将'} ]->( b )
RETURN a, b;

同理继续增加关系

MATCH ( a: Person ), ( b: Person )
WHERE a.name = "吕蒙" AND b.name = "关羽"
CREATE ( a )-[ r: beat ]->( b )
RETURN a, b;
MATCH ( a: Person ), ( b: Person )
WHERE a.name = "吕蒙" AND b.name = "周瑜"
CREATE ( a )-[ r: colleagues ]->( b )
RETURN a, b;

通过MATCH显示全部节点如下


(2)检索节点

检索节点可以直接用MATCH和结合WHERE语句,比如name是关羽的节点

MATCH (a: Person {name: '关羽'}) RETURN a

也可以使用WHERE语句

MATCH (a: Person)
WHERE a.name = '关羽'
RETURN a

并且节点圆圈出现三个可以点击的功能,比如删除当前节点的可视化,拓展出节点的关系和子节点



同时在图片的下面看到一行节点的属性信息和标签信息



检索的呈现结果除了Graph,还有Table和Text,分别以JSON格式或者表格和文本格式呈现出检索结果
Table的结果

Text的结果

下一步可以使用Cypher语言检索多个节点,并且可以返回节点的属性信息,比如查找power属性是孙吴的Person的name信息

MATCH (a: Person)
WHERE a.power="孙吴"
RETURN a.name

返回结果如下,此时由于直接返回字符串而不是节点所以没有Graph呈现方式了


(3)查询关系

查询蜀汉和对应武将的归属关系,先再增加一条蜀国和刘备的关系

MATCH (a: Person), (b: Power)
WHERE a.name="刘备" and b.name="蜀汉"
CREATE (a) -[r:role_in {name:"君主"}]-> (b)
RETURN a, b

开始检索蜀国的武将和蜀国的关系

MATCH (a: Person) -[r:role_in]-> (b:Power) RETURN a, b

查看谁击败了关羽

MATCH (a: Person) -[r:beat]-> (b:Person)
WHERE b.name = "关羽"
RETURN a.name

如果仅仅是和关羽有关联,可以不指定关系标签,可以返回所有和关羽有关联的节点

MATCH (a: Person) -[]-> (b)
WHERE a.name = "关羽"
RETURN a, b;


在检索关系的时候可以不指定方向,此时第二个节点的箭头->改为-即可,比如同样是检索和刘备有关系的节点和关系,先指定方向,此时刘备必须为出节点

MATCH (a: Person) -[]-> (b) 
WHERE a.name = "刘备" 
RETURN a, b;

再指定无向,此时刘备可以为出入任意节点,结果就比指定有向的多

MATCH (a: Person) -[]- (b) 
WHERE a.name = "刘备" 
RETURN a, b;
(4)其它常用的查询

通过Web客户端的命令窗口查询所有节点的标签种类,使用ALL db.labels()命令


查看总共有多少中关系标签,使用CALL db.relationshipTypes()命令

查看索引,使用CALL db.indexes()

查看有多少节点,使用count方法


neo4j-shell使用

neo4j-shell是自带的命令行工具,可以运行命令返回结果,ubuntu下直接启动neo4j-shell即可

root@ubuntu:~# neo4j-shell
Welcome to the Neo4j Shell! Enter 'help' for a list of commands. Please note that neo4j-shell is deprecated and to be replaced by cypher-shell.
NOTE: Remote Neo4j graph database service 'shell' at port 1337

neo4j-sh (?)$ 

输入Cypher语句,结果以二维表的Table格式显示,如果返回节点则呈现出来的是Node信息属性,如果返回的具体的值则返回属性表头和属性值,除此之外返回查询响应时间

neo4j-sh (?)$ MATCH (n) RETURN n.name;
+--------+
| n.name |
+--------+
| "关羽"   |
| "周瑜"   |
| "刘备"   |
| "吕蒙"   |
| "蜀汉"   |
+--------+
5 rows
84 ms
neo4j-sh (?)$ MATCH (n) RETURN n;
+-----------------------------------------+
| n                                       |
+-----------------------------------------+
| Node[0]{name:"关羽",power:"蜀",force:98}   |
| Node[1]{force:64,name:"周瑜",power:"孙吴"}  |
| Node[20]{force:78,name:"刘备",power:"蜀汉"} |
| Node[21]{force:76,name:"吕蒙",power:"孙吴"} |
| Node[22]{name:"蜀汉"}                     |
+-----------------------------------------+
5 rows
52 ms

neo4j-shell可以换行,最终以分号;作为结尾标志语句结束开始执行,退出neo4j-shell输入exit,不需要分号结束

Python操作neo4j

Python使用py2neo操作neo4j,首先安装

root@ubuntu~# pip install py2neo

建立链接,输入http url以及认证用户名和密码

from py2neo import Graph

graph = Graph("http://0.0.0.0:7474", auth=("neo4j", "123456"))

可以直接使用run方法运行Cypher语句,得到和neo4j-shell一样的效果

res = graph.run(
    """
    MATCH (a: Person) 
    WHERE a.power="孙吴"
    RETURN a.name
    """)

结果可以使用data()to_ndarray()evaluate()收集起来,分别输出为list,numpy.ndarray,纯值(第一个值)格式,分别输出如下

print(res.data())
[{'a.name': '周瑜'}, {'a.name': '吕蒙'}]
print(res.to_ndarray())
[['周瑜']
 ['吕蒙']]
print(res.evaluate())
周瑜

也可以不使用Cypher使用py2neo自己的API实现操作,主要有

  • NodeMatcherNodeMatch:对节点进行匹配,检索节点,分别使用matchwhere进行检索
  • RelationshipMatcherRelationshipMatch:对关系进行匹配,检索关系和节点,分别使用matchwhere进行检索

使用NodeMatcher的match方法进行检索,检索标签是Person,且属性中name是关羽的节点,结果只去第一个first,遍历属性使用items()方法

from py2neo import Graph
from py2neo.matching import NodeMatcher
graph = Graph("http://0.0.0.0:7474", auth=("neo4j", "gp123456"))
nodes = NodeMatcher(graph)
res = nodes.match("Person", name="关羽").first()  
# 也可以在match后面调用where
# nodes.match("Person").where(name="关羽").all()
for k, v in res.items():
    print(k, v)
name 关羽
force 98
power 蜀

返回节点有多个的情况下,调用count()查看节点数,调用all()方法遍历出所有节点

res = nodes.match("Person", power="孙吴")
print(len(res))  # 匹配到的节点数
print(res.count())  # 匹配到的节点数
# 遍历
for node in res.all():
    print("==========")
    for k, v in node.items():
        print(k, v)
2
2
==========
name 周瑜
force 64
power 孙吴
==========
name 吕蒙
force 76
power 孙吴

可以调用exists方法查看检索语句是否有返回值,即是否为空

nodes = NodeMatcher(graph)
nodes.match("Person").where(name="关羽").exists()  # True
nodes.match("Person").where(name="关羽", age=3).exists()  # False

也可以使用NodeMatch,使用where方法进行匹配,使用示例如下

from py2neo.matching import NodeMatch
graph = Graph("http://0.0.0.0:7474", auth=("neo4j", "gp123456"))
nodes = NodeMatch(graph)
nodes.where(name="关羽").first()
Node('Person', force=98, name='关羽', power='蜀')

下面测试RelationshipMatcher,并对匹配到的结果做进一步信息提取,RelationshipMatcher需要指定节点对,关系标签,属性等

from py2neo.matching import RelationshipMatcher
from py2neo import Graph
graph = Graph("http://0.0.0.0:7474", auth=("neo4j", "gp123456"))
nodes = NodeMatcher(graph)
Relationships = RelationshipMatcher(graph)
# 先匹配图上一个节点作为RelationshipMatcher的节点入参,在r_type可以加入更多属性
res = Relationships.match((nodes.match("Person").where(name="关羽").first(), ), r_type="role_in").all()
# [role_in(Node('Person', force=98, name='关羽', power='蜀'), Node('Power', name='蜀汉'), name='武将')]
# 提取关系属性
res[0].get("name")  # 武将 只有name一个属性
res[0].nodes  # 提取节点 (Node('Person', force=98, name='关羽', power='蜀'), Node('Power', name='蜀汉'))
res[0].nodes[0].get("name")  # 关羽 提取节点属性
res[0].nodes[0]._labels  # {'Person'} 提取节点的标签
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容