增删节点和关系
增加和删除节点
在Neo4j中添加数据可以通过如下命令进行。
create
:创建新的节点
或关系
。merge
:每次创建新的节点
或关系
前都会先判断目标是否已存在,如果存在则不创建。
# m1表示1号男星(m表示性别为male)实例,Actor表示他的类型/标签为男演员,姓名为n1(也就是拼音“男1”)
> create (m1:Actor {name:"n1"})
然后到http://172.16.185.176:7474/browser/中执行。

命令都按此方式执行。
# 为了确保不增加重复的节点,可以用merge执行
> merge (m2:Actor {name:"n2"})
> merge (m3:Actor {name:"n3"})
> merge (m4:Actor {name:"n4"})
> merge (m5:Actor {name:"n5"})
> merge (m6:Actor {name:"n6"})
> merge (m7:Actor {name:"n7"})
> merge (m8:Actor {name:"n8"})

以上命令执行完成后,可以点击旁边的数据库图标看图形化结果。

再执行下面的命令把这些节点
都删除掉。
# 删除所有节点(如果节点之间有关系,这个会执行失败)
> match (n) delete n
# 或者一次性删除所有节点及其关系(这个无视节点之间的关系约束,它会一并删除掉)
> match (n) detach delete n
删除所有节点后,左边已经看不到任何节点信息了。

上面的命令最好在下一步添加
关系
之前就执行,否则存在关系约束
(也就是删除节点
之前必须先删除它们之间的关系
)之后,再执行起来就会比较麻烦。
下面再来操作这些节点
之间的关系。
增加和删除关系
特别注意
节点
要和关系一起添加,如果它们不在一起执行,就会出现意想不到的情况。
例如,一条条地执行下面的命令。
# 增加节点
> merge (m2:Actor {name:"n2"})
> merge (m5:Actor {name:"n5"})
# 给节点增加关系
> merge (m2:Actor {name:"n2"}) -[:cousin]-> (m5:Actor {name:"n5"})
结果就会像下面这样。

这是因为Neo4j是以事务的方式
执行命令的,也就是它会将同一批语句看作一个事务
,其中语句之间是有上下文
关系的。
当执行完merge (m2:Actor {name:"n2"})
和merge (m5:Actor {name:"n5"})
,再重新执行merge (m2:Actor {name:"n2"}) -[:cousin]-> (m5:Actor {name:"n5"})
时,它会认为这两个节点是和前面没有关系的新节点,并重新创建它们。
虽然变量名和属性一样,但这些节点在Neo4j内部的id
是不一样的(感兴趣的可以自己单击节点看看)。
知道原因之后,再来验证这个想法是否正确。
先清除错误的数据。
# 先删除两个节点之间的某个关系(这里的f可以用其他的合法符号替换)
> match (m2:Actor {name:"n2"}) -[f:cousin]-> (m5:Actor {name:"n5"}) delete f
# 再逐个删除节点
> match (m2:Actor{name:"n2"}) delete m2
> match (m5:Actor{name:"n5"}) delete m5
# 也可以使用下面的语句删除某个节点及其所有的关系
> match (m1:Actor {name:"男星1"}) detach delete m1
# 或者一次性删除所有节点及其关系
> match (n) detach delete n
然后把下面所有的语句一次全部执行完。
# 拷贝下面的语句并一次性全部执行
# 这里用 merge (m2:Actor {name:"n2"}) -[:cousin]-> (m5:Actor {name:"n5"}) 会报错
> merge (m2:Actor {name:"n2"}) merge (m5:Actor {name:"n5"}) merge (m2) -[:cousin]-> (m5)
上面的语句之所以可以正确执行,是因为它们在同一个事务
内,最后一条语句merge (m2) -[:cousin]-> (m5)
中的m2
和m5
是依赖于前面语句中已经定义的变量
的,会话只在当前执行期间有效。
再次清除测试数据。
> match (n) detach delete n
最后,按照异兽志
图谱,一次性添加所有的男星及其之间的关系(好像女星之间没啥关系),而且把它们都换成中文显示。
> merge (m1:Actor {name:"男星1"}) merge (m2:Actor {name:"男星2"}) merge (m3:Actor {name:"男星3"}) merge (m4:Actor {name:"男星4"}) merge (m5:Actor {name:"男星5"}) merge (m6:Actor {name:"男星6"}) merge (m7:Actor {name:"男星7"}) merge (m8:Actor {name:"男星8"}) merge (m2) -[:堂兄弟]-> (m5) merge (m4) -[:好友]-> (m3) merge (m5) -[:仇家]-> (m4) merge (m5) -[:拜把兄弟]-> (m7) merge (m8) -[:经纪人]-> (m6)
# 注意:除了最后一条命令外,其他每一条命令后面都有空格,不然全部拷贝到Neo4j中执行会出错
> merge (m1:Actor {name:"男星1"})
merge (m2:Actor {name:"男星2"})
merge (m3:Actor {name:"男星3"})
merge (m4:Actor {name:"男星4"})
merge (m5:Actor {name:"男星5"})
merge (m6:Actor {name:"男星6"})
merge (m7:Actor {name:"男星7"})
merge (m8:Actor {name:"男星8"})
merge (f1:Actor {name:"女星1"})
merge (f2:Actor {name:"女星2"})
merge (f3:Actor {name:"女星3"})
merge (f4:Actor {name:"女星4"})
merge (f5:Actor {name:"女星5"})
merge (m2) -[:堂兄弟]-> (m5)
merge (m4) -[:好友]-> (m3)
merge (m5) -[:仇家]-> (m4)
merge (m5) -[:拜把兄弟]-> (m7)
merge (m8) -[:经纪人]-> (m6)
merge (f1) -[:夫妻]-> (m1)
merge (m1) -[:旧爱]-> (f4)
merge (m2) -[:离异]-> (f1)
merge (m2) -[:兄妹]-> (f5)
merge (m4) -[:旧爱]-> (f2)
merge (f2) -[:离异]-> (m3)
merge (m3) -[:绯闻]-> (f3)
merge (m5) -[:旧爱]-> (f3)
merge (m7) -[:旧爱]-> (f3)
merge (m1) -[:旧爱]-> (f3)
merge (m6) -[:旧爱]-> (f3)
merge (f4) -[:旧爱]-> (m8)
merge (f5) -[:离异]-> (m8)
执行之后,结果显示如下。

贵圈
关系的完美还原可以看到,Neo4j已经完美地还原出了《山海经·异兽志》的复杂关系——WYSIWYG。
如果这些都用MySQL来搞,恐怕很难看见全貌。
另外,除了单向关系
,Neo4j也能管理好双向关系
。
# 先清除数据,排除干扰
> match (n) detach delete n
# 然后增加一个双向关系
> merge (a:Actor {name:"女星1"}) merge (b:Actor {name:"男星1"}) merge (a) -[:一般朋友]-> (b) merge (b) -[:暗恋]-> (a)

感谢支持
更多内容,请移步《超级个体》。