影刀RPA 知识图谱可视化:数据关系的自动发现与展示
📅 2026/7/21 8:53:52
👁️ 阅读次数
📝 编程学习
影刀RPA 知识图谱可视化:数据关系的自动发现与展示
作者:林焱
什么情况用什么
数据分析师经常面对这个问题:“A公司和B公司有什么关系?”“张三是哪些公司的股东?”"这笔交易经过了多少层关联方?"这些关系隐藏在工商数据、股权结构、交易记录里,人工梳理一个企业的关系网络可能要一整天。
影刀RPA+Neo4j的组合:采集关系数据 → 构建知识图谱 → 用Python做可视化。适合企业尽调、关联交易识别、供应链溯源等场景。
怎么做
拼多多店群自动化报活动上架!
第一步:采集关系数据
企业工商数据(天眼查/企查查):
1. 【打开网页】打开天眼查 2. 【填写】搜索框输入企业名称 3. 【点击】搜索 4. 【点击】"股东信息"标签 5. 【获取文本】抓取股东名称、持股比例 6. 【循环】点击每个股东 → 查看其对外投资 → 继续展开交易关系数据:
1. 【连接数据库】读取ERP/财务系统的交易记录 2. 【执行SQL】SELECT 采购方, 销售方 FROM 交易表 WHERE 年份 = 2026 3. 【读取结果】存入变量第二步:构建Neo4j知识图谱
fromneo4jimportGraphDatabase uri="bolt://localhost:7687"driver=GraphDatabase.driver(uri,auth=("neo4j","password"))defcreate_company(tx,name,props={}):tx.run("MERGE (c:Company {name: $name}) SET c += $props",name=name,props=props)defcreate_person(tx,name,props={}):tx.run("MERGE (p:Person {name: $name}) SET p += $props",name=name,props=props)defcreate_relation(tx,from_entity,to_entity,rel_type,props={}):query=f""" MATCH (a {{name: $from}}), (b {{name: $to}}) MERGE (a)-[r:{rel_type}]->(b) SET r += $props """tx.run(query,from=from_entity,to=to_entity,props=props)# 批量导入关系withdriver.session()assession:# 导入企业节点forcompanyincompanies:session.execute_write(create_company,company['name'],company)# 导入人物节点forpersoninshareholders:session.execute_write(create_person,person['name'])# 导入持股关系forrelinshareholding_rels:session.execute_write(create_relation,rel['from'],rel['to'],'持股',{'比例':rel['ratio'],'金额':rel['amount']})第三步:关系查询与分析
deffind_indirect_relations(tx,entity_name,max_depth=3):"""查找间接关联路径"""query=f""" MATCH path = (start {{name: $name}})-[*1..{max_depth}]-(end) WHERE start <> end RETURN path LIMIT 100 """result=tx.run(query,name=entity_name)return[record['path']forrecordinresult]deffind_common_shareholders(tx,company_a,company_b):"""找共同股东"""query=""" MATCH (p:Person)-[:持股]->(a:Company {name: $a}) MATCH (p)-[:持股]->(b:Company {name: $b}) RETURN p.name AS 股东, p """result=tx.run(query,a=company_a,b=company_b)return[record['股东']forrecordinresult]defdetect_circular_ownership(tx):"""检测循环持股"""query=""" MATCH path = (c:Company)-[:持股*2..5]->(c) RETURN path """returnlist(tx.run(query))第四步:可视化
importnetworkxasnximportmatplotlib.pyplotasplt# 从Neo4j查询结果构建NetworkX图G=nx.DiGraph()withdriver.session()assession:result=session.run(""" MATCH (n)-[r:持股]->(m) RETURN n.name, m.name, r.比例 """)forrecordinresult:G.add_edge(record['n.name'],record['m.name'],weight=float(record['r.比例']))# 按社区着色fromnetworkx.algorithmsimportcommunity communities=community.greedy_modularity_communities(G.to_undirected())color_map={}fori,comminenumerate(communities):fornodeincomm:color_map[node]=i plt.figure(figsize=(16,12))pos=nx.spring_layout(G,k=2,iterations=50)nx.draw(G,pos,node_color=[color_map.get(n,0)forninG.nodes()],node_size=[G.degree(n)*200forninG.nodes()],with_labels=True,font_size=8,cmap=plt.cm.tab20)plt.title('企业关联关系图谱')plt.savefig(r'D:\reports\knowledge_graph.png',dpi=200,bbox_inches='tight')有什么坑
坑1:数据量爆炸
从一家公司展开,三级关联可能涉及上千个节点。查询和可视化都会很慢。加深度限制(max_depth=3)和节点数上限。
TEMU店群矩阵自动化运营核价报活动
坑2:同名实体混淆
"张三"可能是三个不同的人。需要额外的区分字段(身份证号、出生年份),否则图谱中会错误合并。
坑3:Neo4j社区版限制
Neo4j社区版只支持单数据库,多项目公用一个实例容易数据混乱。用不同的label前缀区分项目。
坑4:图谱可视化节点太多
超过200个节点的图可视化出来就是一团黑。用交互式可视化(pyvis、ECharts)比静态图效果好:
frompyvis.networkimportNetwork net=Network(height='800px',width='100%',notebook=False)fornodeinG.nodes():net.add_node(node,label=node)foredgeinG.edges():net.add_edge(edge[0],edge[1])net.show('graph.html')总结:知识图谱的核心价值在"发现隐藏关系"——A公司和B公司表面没关系,但穿透三层后发现是同一实控人。RPA负责数据采集,Neo4j负责关系计算,最终输出一目了然的可视化图谱。
编程学习
技术分享
实战经验