【问题标题】:Find root node for all nodes in a neo4j cypher query在 neo4j 密码查询中查找所有节点的根节点
【发布时间】:2016-06-30 15:35:00
【问题描述】:

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

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

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

这可以是单个级别,例如一家公司收购另一家公司,这就是事情的结局,或者可能有多个层次,一家公司收购另一家公司,然后再收购另一家公司,依此类推。

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

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

附:如果您对此类事情应该使用哪个数据库或更好的数据库设计有更好的想法,我很乐意听到。

【问题讨论】:

    标签: database database-design neo4j cypher


    【解决方案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)
    

    这让我们可以测试几个不同的场景:

    • 一家公司尚未收购另一家公司 (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    │
    └───────┴─────┘
    

    【讨论】:

    • 感谢您的回复和很好的例子!不幸的是,该查询对我不起作用。它只是返回公司名称本身,而不是其所有者的名称。我将id 替换为company,因为“公司”在我的数据库中保存了名称。但除此之外,我还应该对该代码进行其他更改以使其适合我的特定数据库吗?再次感谢!
    • 如果你能给我一个你的数据集样本,我们可以找出正确的属性来使用。
    • @NickBurleigh 是否有可能您使用了错误的关系类型?确保编辑查询以使用正确的关系类型。它区分大小写。
    猜你喜欢
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多