【问题标题】:Graph database schema design - Is this suitable for neo4j?图形数据库模式设计 - 这适用于 neo4j 吗?
【发布时间】:2015-04-01 07:50:08
【问题描述】:

场景:一个简单的地址簿,用户可以在其中创建自己的联系人并通过将他们添加到组中来组织他们。一个联系人可能有多个地址。

我创建了以下图表: ![模式设计][1]

我想查询所有放在 x 组并且居住在 y 国的联系人。

这种架构设计是否足以满足这些目的(我想使用 neo4j 数据库)?

【问题讨论】:

    标签: database neo4j database-schema graph-databases schema-design


    【解决方案1】:

    看起来country 的概念应该是图表中的一等公民,因为您的查询依赖于它。图模型设计通常会受到查询模式的很大影响。

    所以我建议为每个国家/地区设置一个标记为Country 的节点,并将Address 节点与:LOCATED_IN 关系连接到该国家/地区。 (因此从地址节点中删除国家属性)。

    有了这个改变,你的查询就很简单了:

    MATCH (:Group{name:'family'})<-[:placed_in_group]-(contact)-[:lives-at]->()-[:LOCATED_IN]->(:Country{name:'US'})
    RETURN contact
    

    【讨论】:

    • 谢谢!我很感激。
    • 顺便问一下,Stefan,你有没有比较过关于密集节点在这种情况下对性能有多大影响的统计数据?假设我有大约 20K 个具有 Prop 属性的节点(可能也对其进行了索引),我正在查询数据库只是为了找到所有具有 Prop 的节点,然后过滤具体的 Prop 值(可能的 Prop 值的数量相当小:我可以将它们全部枚举(比如 1000 个可能的值))。如果我创建一个标签Prop 并与之创建 20K 关系,那会是更好的设计吗?在性能方面什么是更好的选择?
    • 您需要注意,如果同时将多个地址连接到同一个国家/地区,您可能会遇到锁定问题。创建关系也意味着锁定它的开始和结束节点。但是,您可以通过在全国范围内拥有几个“对接节点”来轻松解决这个问题。然后该地址选择一个对接节点,例如通过对线程 ID 进行一致的散列 - 这可以防止锁定问题。在查询方面,我没有可用的测量值。
    • 嗨 Stefan,你能不能也看看我的问题,和 NEO4J stackoverflow.com/questions/37374675/…987654321@ 差不多
    【解决方案2】:

    正如 stefan Armbruster 所指出的,一种选择是从国家地址获得另一个节点。如果您不想更改数据结构,只需在地址的“国家/地区”字段中添加索引即可。然后就可以查询了

    MATCH (:Group{name:'family'})&lt;-[:placed_in_group]-(contact)-[:lives-at]-&gt;(:Address{country:'US'})

    【讨论】:

    • 谢谢。我很感激这个小费!
    猜你喜欢
    • 1970-01-01
    • 2015-11-13
    • 2021-04-21
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多