- Neo4j 图的组件
- 建模过程
- 使用 Cypher 使用测试数据创建图形(实例模型)。
- 由于关键用例的变化或性能原因,重构(改进)图形数据模型。
- 重构在开发过程中很常见。与 RDBMS 中的模式不同,Neo4j 图形有一个非常灵活的可选模式。Cypher 开发人员可以轻松修改图形以表示改进的数据模型。
- 领域
- 模型的目的
- 模型类型
- 数据类型(Data model)
- 数据模型描述了图形的标签、关系和属性。它没有将在图表中创建的特定数据。
- 图形数据模型很重要,因为它定义了在应用程序创建和使用图形时将用于标签、关系类型和属性的名称。
- 实例类型(Instance model)
- 帮助我们确认我们的数据模型可以满足应用程序的用例。
- 建模风格指南
- 标签是以大写字母开头的单个标识符,可以是CamelCase。
- 关系类型是单个标识符,全部为大写字母并带有下划线字符。
- 节点或关系的属性键是以小写字母开头的单个标识符,可以是CamelCase式。
- 建模节点(Modelig Nodes)
- 创建节点
- MATCH (n) DETACH DELETE n;
- MERGE (:节点名 {标签1: '属性', 标签2: '属性', 标签3: '属性', 标签4: [属性数组]})
- 建模关系(Modeling Relationships)
- 命名关系
- 使用所有大写字母/下划线字符的 Neo4j 最佳实践作为关系的名称。
- 关系方向
- 在 Neo4j 中创建关系时,方向必须明确指定或由指定模式中的从左到右方向推断。
- 创建关系
- MERGE ( 起始节点 )-[ :关系名 { 关系属性名: '属性值' } ]->( 结束节点 )
- 用于 MATCH 查找用户和电影节点,然后用于 MERGE 创建两个节点之间的关系。请记住,在创建关系时必须指定或推断(从左到右)方向。
- 测试用例期间需要做什么
- 测试和修改用于测试用例的任何 Cypher 代码。
- 测试用例
- MATCH ( 别名1 : 节点/标签1 ) - [ 关系标签 : 关系 ] - ( 别名2 : 节点/标签2 ) WHERE 条件1 AND/OR 条件2 AND ['值1','值2'...] IN 列名 RETURN 列名/关系属性 AS 列名(列名长用反引号)ORDER BY 列名 DESC/ASC Limit 数字
- 节点计数
- MATCH ( 标签 : 节点 ) RETURN count(*)
- 关系计数
- MATCH () - [ :关系 ] - () RETURN count(*)
- 重构图表
- 重构的原因
- 出现了一个新的用例,您必须在数据模型中考虑该用例。
- 用例的 Cypher 表现不佳,尤其是当图形缩放时
- 重构步骤
- 编写 Cypher 代码来转换现有图形以实现新的数据模型。
- 重新测试所有用例,可能使用更新的 Cypher 代码。
- 图中的标签
- 返回图中的所有Person节点。
- MATCH (n:Person) RETURN n
- 使用 PROFILE 分析查询
- PROFILE MATCH (n:Person) RETURN n

- 执行的次数和执行的时间,越小越优。

- 不要过度的使用标签
- 因为缓存是自动填充的,所以有时很难用小数据集来衡量性能。也就是说,数据库命中率和运行时间可能无法比较。
- 重构图表
- MATCH (p:Person) WHERE exists ((p)-[:ACTED_IN]-()) SET p:Actor
- 消除重复数据
- 添加节点属性
- MATCH ( m:Movie { m.title : 'Apollo13'} ) SET m.languages=['English']
- 查询重复数据
- MATCH ( 别名 : 节点 ) WHERE [ ' 值1 ' , ' 值2 ' ] IN 列名 RETURN 返回的列
- 重构重复数据

- 如Oracle数据库,新添加一个表,将重复的列的惟一值写到新表中
- 消除节点的复杂数据
- 原因
- 重复数据。许多节点可能在特定位置有生产公司,并且数据在许多节点中重复。如Oracle中的列名不能重复,主键惟一。
- 使用特定关系
- 重构以专门化关系

- 重构图形以添加这些专用关系的代码使用 APOC 库。
- apoc.merge.relationship 允许您在图中动态创建关系的过程。
- 中间结点
- 添加角色节点

-
- match(a:Actor)-[r:ACTED_IN]->(m:Movie)
- merge (x:Role{name:r.role})
- merge(x)-[:IN_MOVIE]->(m)