如何按日期查询公司股东并从Shareholder关系计算持股百分比
基于Cypher查询指定日期公司股东及持股百分比
需求说明
现有两种节点:Person(个人)、Company(公司);存在SHAREHOLDER(股东)关系,支持Person→Company或Company→Company的指向;关系包含属性shareholding_start_date(持股起始日期)、shareholding_end_date(持股结束日期)、number_of_shares(持股数量)。需通过公司名称+指定日期,查询该日期当天持有目标公司股份的所有股东(个人/公司),并计算持股百分比。
解决方案
以下是两种输出格式的Cypher查询语句,可根据需求选择:
1. 结构化表格输出
适合后续数据处理,清晰展示每个股东的持股占比:
MATCH (shareholder)-[rel:SHAREHOLDER]->(company:Company) WHERE company.name = $companyName AND rel.shareholding_start_date <= $targetDate AND rel.shareholding_end_date >= $targetDate WITH shareholder, rel.number_of_shares AS shares, SUM(rel.number_of_shares) OVER () AS totalShares WITH shareholder, shares, totalShares, // 处理总股数为0的极端情况,避免除以0报错 CASE WHEN totalShares = 0 THEN 0 ELSE ROUND((shares * 100.0) / totalShares, 2) END AS percentage RETURN // 统一输出股东名称(Person和Company节点均需包含name属性) CASE WHEN shareholder:Person THEN shareholder.name ELSE shareholder.name END AS 股东名称, percentage AS 持股百分比 ORDER BY percentage DESC
2. 字符串聚合输出
符合示例要求的ABC 15%, DEF 25%, GHI 60%格式:
MATCH (shareholder)-[rel:SHAREHOLDER]->(company:Company) WHERE company.name = $companyName AND rel.shareholding_start_date <= $targetDate AND rel.shareholding_end_date >= $targetDate WITH shareholder, rel.number_of_shares AS shares, SUM(rel.number_of_shares) OVER () AS totalShares WITH CASE WHEN shareholder:Person THEN shareholder.name ELSE shareholder.name END AS 股东名称, CASE WHEN totalShares = 0 THEN 0 ELSE ROUND((shares * 100.0) / totalShares, 2) END AS percentage WITH COLLECT(股东名称 + " " + percentage + "%") AS 股东条目 RETURN STRING_AGG(股东条目, ", ") AS 查询结果
关键说明
- 替换查询中的
$companyName和$targetDate为实际参数,例如$companyName = "XYZ"、$targetDate = "2022-03-15" - 确保数据库中日期格式与参数一致(推荐使用
YYYY-MM-DD字符串或Neo4j日期类型) - 节点标签、关系类型需与数据库实际定义完全匹配(例如关系类型若为小写
shareholder,需同步修改查询语句)
内容的提问来源于stack exchange,提问作者Programmer
相关产品推荐
相关产品推荐

