使用的版本:带有Spring的Neo4j 3.0.6 -用于POJO映射的新4j 4.2.0.M1
我试图选择如何使用neo4j对数据进行建模,并比较不同解决方案的优缺点。
要求:
电影元数据示例:
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
解决方案B
有人有关于解决方案B的经验吗?,需要锁定一个将被其他数百万个节点共享的节点有多坏?,对性能和可伸缩性有什么影响?
有人有更好的建模解决方案吗?
发布于 2016-10-31 23:33:55
tl,dr:使用方法A。不要费心于孤立的:Locale节点,除非定期清理,它们不会影响查询性能。
你的方法'A‘到目前为止是更好的解决方案。您确实需要将该数据移出:Movie节点,您是正确的,因为它必须是嵌套的Map或映射列表,node属性都不支持这两个映射。对于存储,您可以将它们转换为列表地图,但这将很难查询,更不用说快速查询了。您对“孤立的”节点的关注是不多的;它会对查询性能和数据大小产生很小的影响(如果有的话),而且在任何情况下都非常容易定期清理以减轻您的思绪。
MATCH (x:Locale) WHERE NOT (x) <- [:METADATA] - () DETACH DELETE x一个月做一次,甚至从来不做,它真的不会对你有多大的影响。您的查询已经受到路径其余部分的限制,因此除非孤立的:Locale节点的数量将大大超过附加的节点,否则只会向查询中可能最大的集合添加一小部分,这也将在第一次执行时被查询操作删除。
至于锁定,它只会影响写查询,而且只有在打开写事务时才会影响。在写入过程中,您可以运行一百万个只读查询,不会受到任何影响。尽管如此,第二个模型很容易导致查询性能缓慢,因为如上所述,不能将索引放在关系属性上。
发布于 2016-10-31 18:45:12
您可以直接将“元数据”存储为每个Movie节点的属性(而无需诉诸key和value)。这是最简单的方法,它避免了锁定问题,并将所需的节点和关系最小化。您可以随时向节点自由添加更多属性。这种方法还允许您为启动查询时需要快速访问的特定Movie属性添加索引。
例如:
CREATE (m:Movie {id: 123, title: 'Men in black', director: 'Barry Sonnenfeld'});更新
如果需要将“元数据”与“数据”保持干净分离,并且还需要能够本地化元数据(包括locale属性的规范),则可以将每个Movie节点与每个区域设置的单个Metadata节点关联起来。Metadata节点将直接包含特定Movie节点的单个区域设置的所有元数据属性。
Cypher可用于执行“级联删除”。例如:
MATCH (m:Movie {id: 123})
OPTIONAL MATCH p=(m)-->()
DELETE p;https://stackoverflow.com/questions/40338267
复制相似问题