2016-06-30 136 views
1

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

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

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

这可能是一个级别,例如一家公司收购了另一家公司,这是事情的结局,或者可能有多个层次,一家公司收购另一家公司,然后收购另一家公司,等等。

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

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

P.S.如果你有更好的想法,应该使用哪种数据库,或者更好的数据库设计,我很乐意听到它。

回答

1

让我们把一个样本数据集:

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路径(ID2,3)
  • 还有就是获取(IDS 4,5,6)
  • 有支获取(IDS 7,8,9,10)

长度> 1路然后你就可以得到公司的名单和他们的主人是这样的:

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

谢谢你的回应和很好的例子!不幸的是,该查询不适合我。它只是返回公司名称本身,而不是它的主人。因为“公司”在我的数据库中包含名称,所以我用'company'替换了'id'。但除此之外,我还应该对该代码进行其他更改以适应特定的数据库吗?再次感谢! –

+0

如果你可以给我一个你的数据集的样本,我们可以找出正确的属性来使用。 –

+0

@NickBurleigh是否有可能使用错误的关系类型?确保编辑查询以使用正确的关系类型。它是区分大小写的。 –

相关问题