查找neo4j cypher查询中

时间:2016-06-30 15:35:00

标签: database database-design neo4j cypher

我正在组织公司合并和收购信息的数据库,对于数据库中任何被收购的公司,我需要找到它当前的公司。基本上,我需要找到每个节点的根节点。

我一直在使用Neo4j数据库,因为我认为基于图形的数据库可能是个不错的选择。我的结构看起来像这样(原谅缺乏正确的语法,这只是为了清晰起见):

(Company)-[Acquired]->(Company)-[Acquired]->(Company)...etc.

这可以是单一级别,例如一家公司收购了另一家公司,这是事情的终点,或者可能有多层,一家公司收购了另一家公司,然后又收购了另一家公司等等。

我需要做的是列出数据库中的每家公司(目前只有500家公司)及其现有公司所有者。

我的Cypher查询技能目前很差,虽然我知道一些SQL和其他语言(Java,Python),但我在查找在线查询语言的综合指南时遇到了困难,所以我真的不知道知道从哪里开始。任何帮助将是真诚的感谢。谢谢!

P.S。如果您更好地了解应该将哪个DB用于此类事情,或者更好的数据库设计,我很乐意听到它。

1 个答案:

答案 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)

enter image description here

这允许我们测试几种不同的场景:

  • 公司尚未收购另一家公司(id 1)
  • 获取的长度= 1路径(ids 2,3)
  • 有一个长度>获得的1条路径(ids 4,5,6)
  • 有分支获得(ids 7,8,9,10)

然后你就可以获得公司及其所有者的清单:

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    │
└───────┴─────┘