首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Neo4j数据建模:私有节点、丰富的关系、锁

Neo4j数据建模:私有节点、丰富的关系、锁
EN

Stack Overflow用户
提问于 2016-10-31 07:47:37
回答 2查看 266关注 0票数 0

使用的版本:带有Spring的Neo4j 3.0.6 -用于POJO映射的新4j 4.2.0.M1

我试图选择如何使用neo4j对数据进行建模,并比较不同解决方案的优缺点。

要求:

  • 电影有一个动态的元数据列表(元数据有3个属性:'key‘、'value’、'locale')。预先不知道电影的元数据数量,也不知道可能的键。它们必须与其他电影技术属性分离,因为它们是本地化的,并被视为业务数据。
  • 元数据属于电影所有,并且总是从电影中访问。它们不能与其他电影分享。
  • 必须能够对元数据值进行快速获取查询。

电影元数据示例:

代码语言:javascript
复制
Movie metadata
  locale 'en_GB':
    title: 'Jurassic Park'
    description: 'description in english'
  locale 'fr_FR':
    description: 'description en francais'
  locale 'none':
    actor: 'Jeff Goldblum'

解A

  • 每个元数据一个节点(每个节点有3个属性:“key”、“value”、“locale”)
  • 缺点:要实现的私有概念(删除要手动管理的元数据孤儿节点,因为spring nei4j/ne4j-ogm不支持)

解决方案B

  • 每个区域设置一个唯一节点(带有1个属性:'locale') (例如:'en_GB')
  • 元数据作为富关系(有两个关系属性:'key‘、'value')
  • 缺点:要创建关系,必须在区域设置节点上使用

有人有关于解决方案B的经验吗?,需要锁定一个将被其他数百万个节点共享的节点有多坏?对性能和可伸缩性有什么影响?

有人有更好的建模解决方案吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-31 23:33:55

tl,dr:使用方法A。不要费心于孤立的:Locale节点,除非定期清理,它们不会影响查询性能。

你的方法'A‘到目前为止是更好的解决方案。您确实需要将该数据移出:Movie节点,您是正确的,因为它必须是嵌套的Map或映射列表,node属性都不支持这两个映射。对于存储,您可以将它们转换为列表地图,但这将很难查询,更不用说快速查询了。您对“孤立的”节点的关注是不多的;它会对查询性能和数据大小产生很小的影响(如果有的话),而且在任何情况下都非常容易定期清理以减轻您的思绪。

代码语言:javascript
复制
MATCH (x:Locale) WHERE NOT (x) <- [:METADATA] - () DETACH DELETE x

一个月做一次,甚至从来不做,它真的不会对你有多大的影响。您的查询已经受到路径其余部分的限制,因此除非孤立的:Locale节点的数量将大大超过附加的节点,否则只会向查询中可能最大的集合添加一小部分,这也将在第一次执行时被查询操作删除。

至于锁定,它只会影响写查询,而且只有在打开写事务时才会影响。在写入过程中,您可以运行一百万个只读查询,不会受到任何影响。尽管如此,第二个模型很容易导致查询性能缓慢,因为如上所述,不能将索引放在关系属性上。

票数 3
EN

Stack Overflow用户

发布于 2016-10-31 18:45:12

您可以直接将“元数据”存储为每个Movie节点的属性(而无需诉诸keyvalue)。这是最简单的方法,它避免了锁定问题,并将所需的节点和关系最小化。您可以随时向节点自由添加更多属性。这种方法还允许您为启动查询时需要快速访问的特定Movie属性添加索引。

例如:

代码语言:javascript
复制
CREATE (m:Movie {id: 123, title: 'Men in black', director: 'Barry Sonnenfeld'});

更新

如果需要将“元数据”与“数据”保持干净分离,并且还需要能够本地化元数据(包括locale属性的规范),则可以将每个Movie节点与每个区域设置的单个Metadata节点关联起来。Metadata节点将直接包含特定Movie节点的单个区域设置的所有元数据属性。

Cypher可用于执行“级联删除”。例如:

代码语言:javascript
复制
MATCH (m:Movie {id: 123})
OPTIONAL MATCH p=(m)-->()
DELETE p;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40338267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档