Database 在neo4j cypher查询中查找所有节点的根节点

Database 在neo4j cypher查询中查找所有节点的根节点,database,database-design,neo4j,cypher,Database,Database Design,Neo4j,Cypher,我正在组织一个公司合并和收购信息数据库,对于数据库中的任何被收购公司,我都需要找到其当前公司。基本上,我需要找到每个节点的根节点 为此,我一直在尝试使用Neo4j数据库,因为我认为基于图形的DB可能是一个不错的选择。我的结构如下所示(请原谅缺少正确的语法,这只是为了清楚起见): 这可能是一个单一层面,例如,一家公司收购了另一家公司,这就是事情的结局,也可能是多个层面,一家公司收购了另一家公司,然后又收购了另一家公司,依此类推 我需要做的是列出数据库中的每家公司(目前只有大约500家)及其当前的公

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

为此,我一直在尝试使用Neo4j数据库,因为我认为基于图形的DB可能是一个不错的选择。我的结构如下所示(请原谅缺少正确的语法,这只是为了清楚起见):

这可能是一个单一层面,例如,一家公司收购了另一家公司,这就是事情的结局,也可能是多个层面,一家公司收购了另一家公司,然后又收购了另一家公司,依此类推

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

目前我的Cypher查询技能相当差,尽管我知道一些SQL和其他语言(Java、Python),而且我在网上很难找到查询语言的全面指南,所以我真的不知道从哪里开始。任何帮助都将不胜感激。谢谢


另外,如果您有更好的主意,应该使用哪种数据库来处理这类事情,或者有更好的数据库设计,我很乐意听您这么说。

让我们把一个示例数据集放在一起:

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)

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

  • 一家公司尚未收购另一家公司(id 1)
  • 有一个长度=1的获取路径(IDS2,3)
  • 获取路径的长度大于1(ID 4,5,6)
  • 存在分支获取(ID 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    │
└───────┴─────┘

谢谢你的回复和很好的例子!不幸的是,这个问题对我不起作用。它只是返回公司本身的名称,而不是其所有者的名称。我将用
公司
替换
id
,因为“公司”在我的数据库中保留名称。但除此之外,我是否应该对代码进行其他更改,以使其适合我的特定数据库?再次感谢!如果您能给我一个数据集的示例,我们就可以找出要使用的正确属性。@NickBurleigh是否可能您使用了错误的关系类型?确保编辑查询以使用正确的关系类型。它区分大小写。
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    │
└───────┴─────┘