最近在研究知识图谱的东西,也在之前的博客中介绍过直接使用cypher进行建立知识图谱,今天又实践了一下怎样在python中使用cypher语言进行知识图谱的构建,网上这方面的资料也比较少,特此分享给大家,内容比较简单哦
原则:
1)cypher用于数据的更新和查询
2)一个cypher语句不能同时查询和更新
3)label没有属性
4)relationship:有方向、有类型
命名规范:
1)实体变量名:小写,属性名:小写
2)实体标签名:首字母大写
3)关系:大写
下面所举的例子在命名规范方面不是太恰当
快乐家族伴随我们这代人的很多时光,给了我们很多快乐的回忆(虽然现在不怎么看了,哈哈哈哈),以他们几个人为节点建立了一个简单的图谱,这样也比较好理解了
from py2neo import Graph,Node,Relationship,cypher
from pandas import DataFrame
##Graph 图
test_graph = Graph('http://localhost:7474',username='neo4j',password='test')
xiena = Node('kuailejiazu',name = '谢娜')
test_graph.create(xiena)
hejiong = Node('kuailejiazu',name = '何炅')
test_graph.create(hejiong)
weijia = Node('kuailejiazu',name = '维嘉')
test_graph.create(weijia)
haitao = Node('kuailejiazu',name = '海涛')
test_graph.create(haitao )
wuxin = Node('kuailejiazu',name = '吴昕')
test_graph.create(wuxin )
运行之后的结果如下所示:
我们可以看出来,运行的结果是一个一个单独的节点,节点之间并没有关系,因此需要告诉彼此之间的关系是什么
注意:
当创建节点的程序代码运行之后,则节点生成,若再重新运行一次,则节点重新被创建,所以当建立关系时,可以将之前创建节点的代码进行注释掉,以避免重复创建节点
有两种方式进行关系的建立
(1)在创建新节点的同时,将关系建立起来
zhangjie = Node('kuailejiazu',name='张杰')
test_graph.create(zhangjie)
xiaofang = Node('kuailejiazu',name=小方’)
test_graph.create(xiaofang)
r = Relationship(zhangjie,'朋友',xiaofang)
test_graph.create(r)
运行出的结果如下所示:
(2)在已有节点的基础之上进行关系的建立
test_graph.create(Relationship(test_graph.data("MATCH(a:kuailejiazu{name:'谢娜'}) return a ")[0]['a'],'朋友',test_graph.data("MATCH(b:kuailejiazu{name:'何炅'}) return b ")[0]['b']))
test_graph.create(Relationship(test_graph.data("MATCH(a:kuailejiazu{name:'谢娜'}) return a ")[0]['a'],'朋友',test_graph.data("MATCH(b:kuailejiazu{name:'维嘉'}) return b ")[0]['b']))
test_graph.create(Relationship(test_graph.data("MATCH(a:kuailejiazu{name:'谢娜'}) return a ")[0]['a'],'朋友',test_graph.data("MATCH(b:kuailejiazu{name:'海涛'}) return b ")[0]['b']))
test_graph.create(Relationship(test_graph.data("MATCH(a:kuailejiazu{name:'谢娜'}) return a ")[0]['a'],'朋友',test_graph.data("MATCH(b:kuailejiazu{name:'吴昕'}) return b ")[0]['b']))
test_graph.create(Relationship(test_graph.data("MATCH(a:kuailejiazu{name:'谢娜'}) return a ")[0]['a'],'夫妻',test_graph.data("MATCH(b:kuailejiazu{name:'张杰'}) return b ")[0]['b']))
test_graph.create(Relationship(test_graph.data("MATCH(a:kuailejiazu{name:'谢娜'}) return a ")[0]['a'],'朋友',test_graph.data("MATCH(b:kuailejiazu{name:'小方'}) return b ")[0]['b']))
运行结果如下所示:
(1)节点的查询
查询姓名为“张杰”的节点
a = test_graph.data("Match(n:kuailejiazu) where n.name = '张杰' return n")
print (a)
运行之后的结果:
[{'n': (d38a016:kuailejiazu {name:"张杰"})}]
使用DataFrame对结果进行输出
print (DataFrame(a))
运行之后的结果:
n
0 {'name': '张杰'}
(2)针对上面的例子,查出所有和”谢娜”节点是朋友关系的节点
b = test_graph.data("MATCH(n:kuailejiazu)-[:朋友]->(end:kuailejiazu) where n.name='谢娜' return end")
print(DataFrame(b))
运行的结果如下所示:
(3)节点的删除
在不小心操作的过程中,多创建了一个节点
于是需要对其进行删除操作
下面的两种方式皆可进行节点的删除
test_graph.data("Match(n:kuailejiazu{name:'额'}) delete n")
test_graph.data("Match(n:kuailejiazu) where n.name='额' delete n")
(4)统计图谱中有多少节点
zongshu = test_graph.data("match(n:kuailejiazu) return count(n)")
print(zongshu)
运行结果:
[{'count(n)': 7}]
a = test_graph.data("MATCH(a:kuailejiazu{name:'谢娜'}) return a ")[0]['a']
a['time'] = '1981/5/6'
print(a['name'])
print(a['time'])
运行的结果如下所示:
谢娜
1981/5/6
暂时先写这么多了,后续有深的体会、学到新的知识点时,会继续更新的