前言
想研究行人重识别了,发现知识图谱的概念在行人重识别里面还是应用挺多的,正好听老师也谈过这个东西。
什么是知识图谱?
知识图谱本质上是语义网络(Semantic Network)的知识库。可以简单地把知识图谱理解成多关系图(Multi-relational Graph)。 在知识图谱里,我们通常用“实体(Entity)”来表达图里的节点、用“关系(Relation)”来表达图里的“边”。**实体指的是现实世界中的事物比如人、地名、概念、药物、公司等,关系则用来表达不同实体之间的某种联系。**现实世界中的很多场景非常适合用知识图谱来表达。 比如一个社交网络图谱里,我们既可以有“人”的实体,也可以包含“公司”实体。人和人之间的关系可以是“朋友”,也可以是“同事”关系。人和公司之间的关系可以是“现任职”或者“曾任职”的关系。 类似的,一个风控知识图谱可以包含“电话”、“公司”的实体,电话和电话之间的关系可以是“通话”关系,而且每个公司它也会有固定的电话。
什么是neo4j?
知识图谱是基于图的数据结构,通常用图数据库进行存储,正好neo4j也是这样一个数据特别好的数据库。
neo4j安装
一、安装JDK
Neo4j是基于Java的图形数据库,运行Neo4j需要启动JVM进程,因此必须安装JAVA SE的JDK
二、下载Neo4j
安装完JDK,Neo4j安装文件
地址:https://neo4j.com/download/other-releases/ 选择windows社区版
解压 我的路径:D:\neo4j-community-4.0.3
三、配置环境变量
新建系统变量
再修改变量path,增加%NEO4J_HOME%\bin
四、尝试启动
以管理员身份运行控制台(win+A+X)
在命令窗口切入到主目录%NEO4J_HOME%\bin
执行neo4j.bat console
运行成功的话,此时可以打开浏览器,输入:
http://localhost:7474/browser/
默认密码:neo4j
更改密码。完成。
五、python里面安装
pip install py2neo==5.0b1
代码
github
https://github.com/yanjingke/new_learngraf
需求分析
为了方便大家理解,我添加点小例子。本次知识图谱的构建主要是构建购买方和销售方之间的交易构建关系。
具体步骤
1.利用pandas读取xls文件,过滤其他列,保留购买方名称,销售方名称,金额
2.创建neo4j创建购买方,购买方节点
3.创建购买方,购买方节点关系节点
数据xls
最终效果
利用pandas读取xls文件,过滤其他列,保留购买方名称,购买方名称,金额
def relation_extraction():
"""联系数据抽取"""
links_dict = {}
sell_list = []
money_list = []
buy_list = []
for i in range(0, len(invoice_data)):
money_list.append(invoice_data[invoice_data.columns[19]][i])#金额
sell_list.append(invoice_data[invoice_data.columns[10]][i])#销售方方名称
buy_list.append(invoice_data[invoice_data.columns[6]][i])#购买方名称
# 将数据中int类型全部转成string
sell_list = [str(i) for i in sell_list]
buy_list = [str(i) for i in buy_list]
money_list = [str(i) for i in money_list]
# 整合数据,将三个list整合成一个dict
links_dict['buy'] = buy_list
links_dict['money'] = money_list
links_dict['sell'] = sell_list
# 将数据转成DataFrame
df_data = pd.DataFrame(links_dict)
print(df_data)
return df_data
创建neo4j创建购买方,购买方节点
create_data = DataToNeo4j()
create_data.create_node(data_extraction()[0], data_extraction()[1])
class DataToNeo4j(object):
"""将excel中数据存入neo4j"""
def __init__(self):
"""建立连接"""
link = Graph("http://localhost:7474", username="neo4j", password="1234")
self.graph = link
#self.graph = NodeMatcher(link)
# 定义label
self.buy = 'buy'
self.sell = 'sell'
self.graph.delete_all()
self.matcher = NodeMatcher(link)
"""
node3 = Node('animal' , name = 'cat')
node4 = Node('animal' , name = 'dog')
node2 = Node('Person' , name = 'Alice')
node1 = Node('Person' , name = 'Bob')
r1 = Relationship(node2 , 'know' , node1)
r2 = Relationship(node1 , 'know' , node3)
r3 = Relationship(node2 , 'has' , node3)
r4 = Relationship(node4 , 'has' , node2)
self.graph.create(node1)
self.graph.create(node2)
self.graph.create(node3)
self.graph.create(node4)
self.graph.create(r1)
self.graph.create(r2)
self.graph.create(r3)
self.graph.create(r4)
"""
def create_node(self, node_buy_key,node_sell_key):
"""建立节点"""
for name in node_buy_key:
buy_node = Node(self.buy, name=name)
self.graph.create(buy_node)
for name in node_sell_key:
sell_node = Node(self.sell, name=name)
self.graph.create(sell_node)
创建购买方,购买方节点关系节点
create_data.create_relation(relation_extraction())
def create_relation(self, df_data):
"""建立联系"""
m = 0
for m in range(0, len(df_data)):
try:
print(list(self.matcher.match(self.buy).where("_.name=" + "'" + df_data['buy'][m] + "'")))
print(list(self.matcher.match(self.sell).where("_.name=" + "'" + df_data['sell'][m] + "'")))
rel = Relationship(self.matcher.match(self.buy).where("_.name=" + "'" + df_data['buy'][m] + "'").first(),
df_data['money'][m], self.matcher.match(self.sell).where("_.name=" + "'" + df_data['sell'][m] + "'").first())
self.graph.create(rel)
except AttributeError as e:
print(e, m)