目录

  • 一、外贸企业关系图谱的构建
    • 1.从Oracle导出数据
    • 2.导入数据到Neo4j
    • 3.Neo4j数据展示
  • 二、用Cypher做企业关联查询
    • 1.多层关系查询
    • 2.基于邻居信息的Jaccard相似度计算
    • 3.加权关联度得分计算
  • 三、总结

一、外贸企业关系图谱的构建

说来惭愧,本科、研究生期间还没写过博客,正巧最近在写论文,想结合自己开发的项目来构思,于是就通过这篇博客记录一下使用Neo4j图数据库来做企业相似度查询的过程,方便以后参考。
这次外贸企业关系图谱的构建用到以前项目中测试库(Oracle)的数据,导入成csv格式后,再通过python的py2neo导入到neo4j中。
-----------由于数据涉及项目的私密信息,暂时就不分享出来了------------

1.从Oracle导出数据

该表在Oracle数据库中的部分结构如下:

目前数据库中的外贸企业数据约30多万条,经过两轮的数据清洗和过滤,我选出了约12万条数据导出,并保存为csv格式。

2.导入数据到Neo4j

Neo4j有自己的csv导入工具,还可以通过cypher语句导入csv格式的数据,但是这里我使用的是pyhon的py2neo库来完成数据的导入。
编写的python代码结构如下:

下面介绍每个函数的详细代码实现:

'''初始化,用于连接到Neo4j'''
def __init__(self, data):self.data = dataself.g = Graph(host="127.0.0.1",  # neo4j 搭载服务器的ip地址http_port=7474,  # neo4j 服务器监听的端口号user="neo4j",  # 数据库user namepassword="112233") # 密码
'''读取文件'''
def read_nodes(self):# 共5类节点enterprise = self.data['COMP_NAME_CH']  # 企业region = set(self.data['PROVINCE_CH'])  # 地区if (np.nan in region):region.remove(np.nan)country = []  # 出口国家for index, row in self.data.iterrows():for r in row['EXPORT_COUNTRY_MXT'].split(','):country.append(r)# 企业类型:1-manufacture-生产型、2-trader-贸易型(贸信通)3-服务型enterprise_type = ['生产型', '贸易型', '服务型']  # 企业类型legal_representative = self.data['LEGAL_REPRESENTATIVE']  # 法人代表# 构建节点实体关系rels_region = []  # 企业-地区关系 locaterels_country = []  # 企业-出口国家关系 exportrels_type = []  # 企业-企业类型关系 type# rels_product = [] # 企业-产品关系 productrels_legal = []  # 企业-法人代表关系 legalfor index, row in self.data.iterrows():if (row['PROVINCE_CH'] is not np.nan):rels_region.append([row['COMP_NAME_CH'], row['PROVINCE_CH']])for r in row['EXPORT_COUNTRY_MXT'].split(','):# 一个企业有多个出口国家rels_country.append([row['COMP_NAME_CH'], r])rels_type.append([row['COMP_NAME_CH'], '生产型' if row['COMP_TYPE'] == 1\else ('服务型' if row['COMP_TYPE'] == 2 else '贸易型')])rels_legal.append([row['COMP_NAME_CH'], row['LEGAL_REPRESENTATIVE']])return set(enterprise), set(region), set(country), set(enterprise_type), set(legal_representative), \rels_region, rels_country, rels_type, rels_legal
'''建立单标签节点'''
def create_node(self, label, nodes):count = 0for node_name in nodes:node = Node(label, name=node_name)self.g.create(node)count += 1print(count, len(nodes))return
'''创建知识图谱外贸企业的节点'''
def create_enterprise_nodes(self):count = 0for index, row in self.data.iterrows():node = Node("Enterprise", name=row['COMP_NAME_CH'], credit_code=row['CREDIT_CODE'],setup_time=row['SETUP_TIME'], address=row['ADDRESS_CH'],captial=str(row['REG_CAPITAL']) + '万人民币')self.g.create(node)count += 1print(count)return
'''创建实体关联边'''
def create_relationship(self, start_node, end_node, edges, rel_type, rel_name):count = 0# 去重处理set_edges = []for edge in edges:set_edges.append('###'.join(edge))all = len(set(set_edges))for edge in set(set_edges):edge = edge.split('###')p = edge[0]q = edge[1]query = "match(p:%s),(q:%s) where p.name='%s'and q.name='%s' create (p)-[rel:%s{name:'%s'}]->(q)" % (start_node, end_node, p, q, rel_type, rel_name)try:self.g.run(query)count += 1print(rel_type, count, all)except Exception as e:print(e)return
'''创建知识图谱实体节点类型schema'''
def create_graphnodes(self):# 获取所有节点和关系Enterprises, Regions, Countries, Enterprise_types, Legal_representatives, \rels_region, rels_country, rels_type, rels_legal = self.read_nodes()# 创建图数据库节点self.create_enterprise_nodes() # 企业self.create_node('Region', Regions) # 地区print('地区:' + str(len(Regions)))self.create_node('Country', Countries) # 出口国家print('出口国家:' + str(len(Countries)))self.create_node('Type', Enterprise_types)  #企业类型print('企业类型:' + str(len(Enterprise_types)))# 暂不需要使用该节点和关系# self.create_node('Legal', Legal_representatives) # 法人代表# print('法人代表:' + len(Legal_representatives))return
'''创建实体关系边'''
def create_graphrels(self):# 获取所有关系组Enterprises, Regions, Countries, Enterprise_types, Legal_representatives, \rels_region, rels_country, rels_type, rels_legal = self.read_nodes()self.create_relationship('Enterprise', 'Region', rels_region, 'locate', '所在地区')self.create_relationship('Enterprise', 'Country', rels_country, 'export', '出口')self.create_relationship('Enterprise', 'Type', rels_type, 'type', '类型')# 暂不需要导入该关系# self.create_relationship('Enterprise', 'Legal', rels_legal, 'legal', '法人')

最后是main函数:

if __name__ == '__main__':# 获取当前路径,并转换为正确格式cur_dir = '/'.join(os.path.abspath(__file__).split('\\')[:-1])data_path = cur_dir + '/TB_ENTERPRISEINFO_FUSE_BAK.csv'print('read_csv from:' + data_path)data = pd.read_csv(data_path)# 创建实例handler = EnterpriseGragh(data)# 构建企业图谱的节点和关系handler.create_graphnodes()handler.create_graphrels()

3.Neo4j数据展示

大约运行了20多小时,终于成功在Neo4j构建好了外贸企业关系图谱,感觉应该是自己在代码优化上可能没有做好=_=||,如果使用Neo4j自带的工具感觉会快上不少。
数据库信息以及查询效果如下图所示:(一共4类节点,3种关系)

二、用Cypher做企业关联查询

简单查询就不打上来了,感觉有一定参考意义有以下几种查询,可以找到和查询企业关联度最高的企业,作为查询结果。

1.多层关系查询

由于该图数据的有向关系只有一层,所以查询时不能指定关系的方向,这里我们以‘陕西和沃进出口有限公司’为例,查询该企业的多层关系,查询结果如下图:

对应的Cypher查询语句如下:

match p=(n:Enterprise{name:'陕西和沃进出口有限公司'})-[*2..3]-() return p limit 20

2.基于邻居信息的Jaccard相似度计算

以查询‘陕西和沃进出口有限公司’为例,根据企业的出口国家,计算企业之间的Jaccard相似度,作为相似度衡量标准。(由于Jaccard计算以出口国家关系为基准,所以结果与3.加权关联度得分计算得到的结果不同)
Jaccard的计算公式参考如下:

根据计算公式,查询到的结果展示如下:

对应的Cypher查询语句如下:

MATCH (n:Enterprise{name:'陕西和沃进出口有限公司'})-[:export]->(c:Country)<-[:export]-(other:Enterprise)
with n,other,count(c) as intersection,collect(c.name) as collection
match (n)-[:export]->(nc:Country)
with n,other,intersection,collection,collect(nc.name) as s1
match (other)-[:export]->(oc:Country)
with n,other,intersection,collection,s1,collect(oc.name) as s2
with n,other,intersection,s1,s2
with n,other,intersection,s1+filter(x IN s2 where not x IN s1) as uni,s1,s2
return n.name,other.name,s1,s2,((1.0*intersection)/SIZE(uni)) as jaccard
order by jaccard DESC
limit 20

3.加权关联度得分计算

以查询‘陕西和沃进出口有限公司’为例,找到和该企业有相同关系的节点,我们对三种关系企业类型、所在地区、出口国家(type、locate、export)进行加权求和并计算得分,以该得分作为企业相似度的评价标准,可以得到最相关的企业如下。

对应的Cypher查询语句如下:

MATCH (n:Enterprise) where n.name='陕西和沃进出口有限公司'
match (n)-[:type]->(t:Type)<-[:type]-(other:Enterprise)
with n,other,count(t) as tn
optional match (n)-[:locate]->(r:Region)<-[:locate]-(other)
with n,other,tn,count(r) as rn
optional match (n)-[:export]->(c:Country)<-[:export]-(other)
with n,other,tn,rn,count(c) as cn
return other.name as 推荐企业,tn as 相同企业类型,rn as 相同地区,cn as 相同出口国家,(3*tn)+(3*rn)+(1*cn) as score
ORDER BY score DESC
limit 100

三、总结

以上就是外贸企业关系图谱的构建+查询的整个流程,比较基础。

个人认为可以应用和研究的方向:企业合作伙伴发现、相似企业推荐、投资风险预测、企业市场预测等场景。

看起来像是那么回事奥,但是其实现在论文还没动笔。。。
希望能尽早确定好论文方向,加油!!

基于Neo4j构建的外贸企业关系图谱做企业相似度查询相关推荐

  1. Python来袭,教你用Neo4j构建“复联4”人物关系图谱!没有剧透!【文末赠书】...

    讲技术之前先引个好玩的热点话题,带你与时代接轨~ 漫威系列电影<复仇者联盟4>上映 你去看了吗? 小编就盼着周末去好好享受 谁剧透,跟谁急! 复仇者联盟 之 绝对不剧透 漫威英雄们为了不让 ...

  2. D3 企业关系图谱 企业构成图谱 股权穿透图 股权结构图 关联方认定图

    前言:之前说做了项目,这个项目黄了,公司跑路了,代码就拿出来分享,主要就是实现各种类似企查查的各种图谱,欢迎交流.目前已大致实现了: D3 企业关系图谱 企业构成图谱 股权穿透图 股权结构图 关联方认 ...

  3. 基于neo4j构建西游记知识图谱

    <西游记>是明代创作的中国古代第一部浪漫主义章回体长篇神魔小说.该小说以"玄奘取经"这一历史事件为蓝本,经作者的艺术加工,深刻地描绘出明代百姓的社会生活状况.<西 ...

  4. echarts做企业关系图谱_建立良好客户关系 做有温度的企业

    客户关系管理(Customer Relationship Management)可以说是企业发展的重大课题.聪明的企业会从客户及潜在客户身上挖掘有用的信息,再将其转化为有助业务的数据.此外,妥善管理客 ...

  5. echarts做企业关系图谱_Echarts绘制关系图(一)

    关系图 何为关系图,从字面上可以看出,为关系的图形,既然为关系,那么就需要有点以及关系,用来表示点与点之间的联系.所以我们可以得出:关系图需要两个必要的元素,节点,关系,其中关系需要包含有联系的节点以 ...

  6. echarts做企业关系图谱_使用Echarts呈现天善用户的关系图

    前一个博客:"<Python网络数据采集>读后总结 --第3章及天善用户关系分析实例"提到了怎么获取天善用户的关系数据,但没有说如何更好呈现关系图,这次介绍一下使用Ec ...

  7. echarts做企业关系图谱_echarts交叉关系图一

    想要做一个公司-人员关系图,官网echarts图graph webkit dep 稍微改了一下, 也是有点恶心自己,调了一个数据最多的去改,如果正好有人需要就不用去改了 说明:此图没有坐标,可以设置图 ...

  8. echarts做企业关系图谱_echarts 关系图

    匿名用户 1级 2016-05-14 回答 使用_buildLinkShapes(nodes, links)函数,针对定义的全部线段数据,设置线段的权重(粗细).样式和高亮样式. 1.zrender定 ...

  9. 不了解喜欢的明星有什么关系?教你用Neo4j 快速构建明星关系图谱,让你比他自己还了解

    前言 本文将带你用 neo4j 快速实现一个明星关系图谱,因为拖延的缘故,正好赶上又一年的4月1日,于是将文中的几个例子顺势改成了"哥哥"张国荣.正所谓"巧妇难为无米之炊 ...

  10. 一文教你用 Neo4j 快速构建明星关系图谱

    更多有趣项目及代码见于:DesertsX/gulius-projects 前言 本文将带你用 neo4j 快速实现一个明星关系图谱,因为拖延的缘故,正好赶上又一年的4月1日,于是将文中的几个例子顺势改 ...

最新文章

  1. java中showconfirmdialog_Java小游戏之连连看
  2. SSH与VMware的Linux虚拟机链接
  3. [C++] Variable storage space
  4. gifcam录制动态图后导入photoshop出现透明格子怎么办?
  5. 理解ASP.NET Core中的中间件
  6. 作者:陈振冲(1959-),男,博士,香港理工大学学务长,电子计算学系教授...
  7. 码农30多岁,要被辞退的时候 怎么办?
  8. Sentence-BERT: 一种能快速计算句子相似度的孪生网络
  9. Fiddler2教程(Web调试工具)
  10. Windows NT 内核基本结构
  11. 【游戏安利】 益智休闲类游戏安利
  12. 这猪蹄是人类能吃完的?
  13. 工作一年的心得体会(持续中.......)
  14. 显示性能指标的计算机术语是,下列计算机术语中,属于显示器性能指标的是()...
  15. 微信小程序内容接入安全检测接口
  16. Vegas如何刻录DVD?
  17. 2017AP计算机科学5分线,2017各国际学校AP分数大比拼,看看你是啥水平
  18. c语言实现的原神圣遗物评分计算器
  19. 记本最新22款验机工具大全(适用于XP和vista)
  20. Excel VBA:计算BOM*Planning

热门文章

  1. 买了北京亲子年票但没有小孩的朋友,接下来的一年我都给你安排好啦!!...
  2. JAVA知识体系之分布式篇(四)——Kafka
  3. 高等数学学习笔记——高等数学(二)学习笔记汇总
  4. 1.18 物主代词 形容词 宾语从句
  5. 为什么Java编程语言用一种咖啡名做名字
  6. 摩擦学类毕业论文文献都有哪些?
  7. python,执行pip报错:Fatal error in launcher: Unable to create process using ‘“D:\tools\python.exe“ (已解决)
  8. DBA-数据库管理员
  9. go语言处理html文件,go语言操作文件实例笔记
  10. 手把手教你 VSCode搭建STM32开发环境