我正在组织公司合并和收购信息的数据库,对于数据库中任何被收购的公司,我需要找到它当前的公司。基本上,我需要找到每个节点的根节点。
我一直在使用Neo4j数据库,因为我认为基于图形的数据库可能是个不错的选择。我的结构看起来像这样(原谅缺乏正确的语法,这只是为了清晰起见):
(Company)-[Acquired]->(Company)-[Acquired]->(Company)...etc.
这可以是单一级别,例如一家公司收购了另一家公司,这是事情的终点,或者可能有多层,一家公司收购了另一家公司,然后又收购了另一家公司等等。
我需要做的是列出数据库中的每家公司(目前只有500家公司)及其现有公司所有者。
我的Cypher查询技能目前很差,虽然我知道一些SQL和其他语言(Java,Python),但我在查找在线查询语言的综合指南时遇到了困难,所以我真的不知道知道从哪里开始。任何帮助将是真诚的感谢。谢谢!
P.S。如果您更好地了解应该将哪个DB用于此类事情,或者更好的数据库设计,我很乐意听到它。
答案 0 :(得分:2)
让我们整理一个样本数据集:
CREATE (c1:Company {id:1}),
(c2:Company {id:2}),
(c3:Company {id:3}),
(c4:Company {id:4}),
(c5:Company {id:5}),
(c6:Company {id:6}),
(c7:Company {id:7}),
(c8:Company {id:8}),
(c9:Company {id:9}),
(c10:Company {id:10}),
(c2)-[:ACQUIRED]->(c3),
(c4)-[:ACQUIRED]->(c5)-[:ACQUIRED]->(c6),
(c7)-[:ACQUIRED]->(c8)-[:ACQUIRED]->(c9),
(c8)-[:ACQUIRED]->(c10)
这允许我们测试几种不同的场景:
然后你就可以获得公司及其所有者的清单:
MATCH ownership = shortestPath((owner:Company)-[:ACQUIRED*0..]->(acquired:Company))
WHERE NOT ()-[:ACQUIRED]->(owner)
RETURN acquired.id AS company, head(nodes(ownership)).id AS owner;
╒═══════╤═════╕
│company│owner│
╞═══════╪═════╡
│1 │1 │
├───────┼─────┤
│2 │2 │
├───────┼─────┤
│3 │2 │
├───────┼─────┤
│4 │4 │
├───────┼─────┤
│5 │4 │
├───────┼─────┤
│6 │4 │
├───────┼─────┤
│7 │7 │
├───────┼─────┤
│8 │7 │
├───────┼─────┤
│9 │7 │
├───────┼─────┤
│10 │7 │
└───────┴─────┘