Neo4j如何避免超级节点

Neo4j如何避免超级节点,neo4j,cypher,spring-data-neo4j,graph-databases,Neo4j,Cypher,Spring Data Neo4j,Graph Databases,在我的Neo4j项目中,我有表示用户角色和权限的角色和权限实体。系统中的每个用户都与相应的角色和权限集有关系 我认为Role和Permission是某种超级节点,从性能的角度来看,它们可能会成为未来的一大难题 这种情况下的最佳做法是什么?如何重新实现角色和权限,以避免超级节点可能出现的问题?我假设您只是使用Neo4j作为权限查找数据源(如hasPermission(当前用户,'Permission_string')),而没有绑定到其他实体的任何查询中。这很好,特别是如果您有一个分层访问模式。如果

在我的Neo4j项目中,我有表示用户角色和权限的
角色
权限
实体。系统中的每个
用户
都与相应的角色和权限集有关系

我认为
Role
Permission
是某种超级节点,从性能的角度来看,它们可能会成为未来的一大难题


这种情况下的最佳做法是什么?如何重新实现
角色
权限
,以避免超级节点可能出现的问题?

我假设您只是使用Neo4j作为权限查找数据源(如
hasPermission(当前用户,'Permission_string')
),而没有绑定到其他实体的任何查询中。这很好,特别是如果您有一个分层访问模式。如果这不是真的,那么这可能不适用,最好能更清楚地了解实体的外观

由于您可能会在整个应用程序中使用权限,因此,如果权限的大小和范围会增加,那么使用某种形式的缓存(例如内存存储或Redis)对性能来说可能是有意义的

甚至可以为每个用户生成每个权限状态的非规范化缓存。因此,您将评估您的规则,这些规则可能基于分层角色/权限,并得出“用户X拥有权限Y”的列表。然后,无论何时更改用户或权限,都会为该实体重新生成缓存,如果更改角色,则会为所有关联的用户和权限重新生成缓存


此外,我不知道我是否会将此建议应用于Neo4j。如果您谈论的是一个简单的键/值查找,那么在性能关键的情况下,许多通用数据库将是多余的。

您是否计划基于角色进行一些聚合/批量查询(即,计算某个角色的人数,列出他们)

如果没有,您只想检查特定用户是否具有特定的角色,而我认为这不会导致难以维护的重要性能问题(因为您将遍历图形的某些关系,忽略“超级节点”的绝大多数多个关系)。我会坚持简单的设计(“过早优化是万恶之源”)),一旦发现问题(在内部,关系存储在类似linkedlist的结构中,因此在超级节点上找到合适的关系可能需要时间,即使您将搜索限制在某个关系类型),使用元节点方法拆分角色节点应该可以完成这项工作(如中所述)

如果是,您有问题。这可能是RDBMS更好的领域。。。使用元节点可能不会有帮助,因为您仍然需要处理所有这些节点以列出/统计所有用户。。。因此,将数据缓存在单独的存储中可能是最好的主意