引言
本文作为该系列的第三篇文章。主要介绍金融证券知识图谱的应用。
- 数据获取和数据模型构建
- 数据抽取和实体对齐
- 知识图谱应用
- 知识图谱更新
全部代码已用 jupyter notebook 的形式开源在 Github 上,感兴趣的朋友可以进行复现。如果觉得有帮助,那就给个star吧~
https://github.com/kevin-meng/financial_stock_knowledge_graphgithub.com1. 前期准备
在开始运用知识图谱时,我们需要为图谱添加索引,以提高查询效率。在浏览器中 neo4j browser 中输出。下面是具体命令:
# 为节点属性创建索引
CREATE INDEX ON :CITY(city);
CREATE INDEX ON :FUND(fund_code);
CREATE INDEX ON :COMPANY(company);
CREATE INDEX ON :FUND_CUSTODIAN(company);
CREATE INDEX ON :FUND_MANAGER(company);
CREATE INDEX ON :LISTED_COMPANY(company);
CREATE INDEX ON :INDUSTRY(industry);
CREATE INDEX ON :MANAGER(manager_id);
CREATE INDEX ON :PROVINCE(province);
CREATE INDEX ON :LISTED_COMPANY(share_code);
# 查看数据库 索引情况。
CALL db.indexes()
当索引的状态全部 ONLINE
之后便算添加成功。
2. 图谱应用
在缺少上层应用层进一步开发的情况下,现阶段对于金融证券知识图谱的应用,主要可以从两个方面展开:可视化、关联查询。
2.1. 可视化
这部分利用 neo4j 自带的可视化插件,对查询结果可视化。优点是更直观。正所谓一图胜千言! 这里举个例子:
查看山东国资背景的上市公司,在城市和行业上的分布情况。
网上查到山东国资背景上市公司,大概有下面这12家
查询代码如下
select
MATCH p1 = (a:LISTED_COMPANY)-[:IN_INDUSTRY]-(b:INDUSTRY)
WHERE a.share_code in ["600022","600547","600223","600858","600350","000498","000338","000977","600756","600784","000756","600789"]
MATCH p2 = (a)-[:IN_CITY]-(c:CITY)-[:IN_PROVINCE]-(d:PROVINCE)
RETURN p1,p2
相信你最终也可以看到如下的结果。选中对应标签可以更改颜色和大小。
2.2 关联查询
知识图谱的一个很重要的应用就是为上层应用和服务提供图查询结构,并返回对应关联数据。 比如推荐系统、以及风控场景下的关联排查等。下面以本次的金融图谱举几个例子。返回数据形式可以选择是表格,也可以是 json 格式。
2.2.1. 江苏省 最受 基金 欢迎(持仓最多)的上市公司
select
MATCH p = (a:FUND)-[:IN_PORTFOLIO]->(b:LISTED_COMPANY)-[:IN_CITY]-(c:CITY)-[:IN_PROVINCE]->(d:PROVINCE {province:"江苏"})
RETURN c.city as city,b.company as company,count(DISTINCT a.fund_code) as num
ORDER BY num DESC
LIMIT 10
返回结果如下:
2.2.2. 上市公司高管董事之间的兼任情况
所谓兼任就是像下面这种一个人同时出现在2家以上的上市公司董事高管名单中。
查询代码如下:
select
#
MATCH (b:COMPANY)-[r1:其他|监事|高管|委员会成员|董事会成员|核心技术人员]->(d:MANAGER)
MATCH (c:COMPANY)-[r2:其他|监事|高管|委员会成员|董事会成员|核心技术人员]->(d)
WHERE b.company<>c.company
RETURN b.company as company_s,
b.share_code as share_code_s ,
r1.title as title_s,
type(r1) as rel_s,
c.company as company_d,
c.share_code as share_code_d,
d.manager_id as manager_id,
r2.title as title_d,
type(r2) as rel_d,
d.name as name
LIMIT 10 ;
2.2.3.基金推荐
这里我们尝试基于知识图谱作为推荐引擎,并为写一条基金推荐的规则。
根据某个基金持仓在不同行业的分布情况,基于此推荐与其持仓行业最相似的 Top5 基金。
以 富国新动力A基金(001508) 为例
select
MATCH p = (a:FUND)-[:IN_PORTFOLIO]->(b:COMPANY)-[:IN_INDUSTRY]-(c:INDUSTRY)
WHERE a.fund_code="001508"
WITH COLLECT(DISTINCT c.industry) as industry_base
MATCH (d:FUND)-[:IN_PORTFOLIO]->(e:COMPANY)-[:IN_INDUSTRY]-(f:INDUSTRY)
WITH d.fund_code as fund_code, d.name as name,industry_base,collect(DISTINCT f.industry) as industry_target
RETURN name,fund_code,
toFloat(length([ind in industry_target where ind in industry_base ]))/length(industry_target) as ration
ORDER BY ration DESC
LIMIT 5
通过上面代码运行便可得到结果。实际中,若验证规则有效便可对接前端业务系统做推荐:
总结
本篇在前期搭建的知识图谱的基础上,探索相关应用,这些应用场景相对具体,但其中的方法逻辑是共通的,可以将其迁移至不同领域。
我们知道世界瞬息万变,旧的关系不断消失,新的关系不断建立。因此一个不能更新的知识图谱的价值终究是有限且短暂的。那么下一篇,我们将讨论如何去更新和迭代我们的关系图谱。敬请期待!
参考文章
- https://zhuanlan.zhihu.com/p/22894178
注:下面是我的 公众号`知行并重`欢迎关注,我会在那分享关于金融风控、图挖掘以及知识图谱的文章,一起交流