当前位置:首页>科技>用状态图建模图数据建模键
发布时间:2026-07-21阅读(1)
在两个以前的文章中,我们涵盖了图形数据建模的方面,例如类别变量,以及关系如何工作。在本文中,让我们解决如何用键(Key)识别图表中的东西。

图形键是属性或一组属性,可帮助识别图形中的节点或关系。
它们经常用作图形遍历的起点,或者用作约束的条件。
我们想要什么键?在我们在Neo4J中的键进入不同选项之前,让我们列出对一个非常好的数据库密钥的属性。
智能键通常是将信息编码为键的复合值。想象一下,我们有一个订购系统,我们确定了客户订单为2020-06-19-VA-9912。它似乎可以方便地编码订单日期(2020-06-19),订单状态(弗吉尼亚)和订单号(9912)中的单个键。在实践中,有几个原因,智能键通常最终会发生灾难:
关于智能键的关键要点是它们总是具有低不透明度;这就是他们的重点。
不要在图中使用复合键在关系数据库中,它是典型的,以定义两个或多个属性的复合键,但在我的视图中,从未在图表中有意义。通常有人使用复合键的通常原因是因为列之间的依赖关系。例如,也许您的客户代码 状态代码一起是唯一标识记录的原因。但由于图允许您拥有您想要的节点,因此这个Cypher代码:
MATCH (r:Record { ccode: "X", scode: "Y" })
通常会比这更糟糕:
MATCH (:A { scode: "Y" })-[:LINKED_TO]->(r:Record { ccode: "X" })
关键是,在大多数情况下,良好的数据模型可以消除对复合键的需要。
在Neo4j中的选择是什么?neo4j内部ID每个节点和关系都会获得自己的“内部”标识符,您可以访问id()函数。

> internal ID of a node
这些ID的优势在于它们总是保证为您服务。通过ID查找在Neo4J中非常快,因为内存工作中的图形存储方式。但是,由于多种原因,内部节点ID(在我的视图中)为非常糟糕的应用程序标识符提供:
基本上,你得到的唯一保证是它们在全球范围内(对该图,而不是DBMS)唯一。虽然这是不透明的,但标识符的权限是数据库(不是您的应用程序),唯一性上下文仅在单个系统上被选中到单个图形。
全球独特的ID使用Apoc内置的UUIDS,您可以像这样创建它们:
CREATE (m:Thing { id: apoc.create.uuid() });

> An APOC-generated UUID
这些是非常好的,因为你是权威,并自己管理他们。它们是稳定的,永远不需要改变。它们在所有环境中都非常独特,它们非常不透明。它们是128位数字,其是伪随机生成的。实际上,你不必担心碰撞,因为空间太大,如果你这样生成103万亿的标识符(我们很确定你将在那之下)碰撞的机会仍然是十亿分之一。够好了。
他们又带来了缺点。
让我们面对它,通常我们的来源数据来自其他地方。如果我们从Twitter导入Tweets到图形中,那么所有推文都有现有ID。经常经常,良好的方法将是通过您的数据导入附带的其他人ID方案。
这很难说这种方法是什么,因为它取决于标识符是什么。我们能做得最好的就是回到那些我们正在寻找的原则(不透明度,独特性等),并评估一个身份证。
我们可以谈谈采用别人的标识符的具体否定:
作为一般性推荐 - 始终存储您可以掌握的任何上游标识符。但不要用它来成为你的标识符。使用它与上游系统相关联。除了存储远程标识符之外,选择自己的ID没有错。
自动递增数字一种常见的方法是使用自动递增号。Neo4j不支持这种情况,但在其他库中找到它很常见,并且它在关系世界中是一种常见的技术。这通常不是最好的方法,因为:
据说,这种方法仍然是由您(好的)控制得不透明(好),以及紧凑型/储存效率。
关系标识符as neo4j 4.1.0,数据库没有常规的B树关系属性索引(它确实支持关系属性上的全文索引)这具有重要的后果,并意味着不可能快速查找个体关系一个ID,因为数据库根本无法将其存储在内。找到关系的方式是通过查找一个(或两者)的事件节点,如下所示:
MATCH (a:Person { id: 1 })-[r:KNOWS]->(b:Person { id: 2 })RETURN r;
在这种情况下,有效地使用“从”和“到”节点作为关系密钥。id()函数仍然存在关系,它们都有内部Neo4j ID,但通常我们不需要将属性ID分配给关系。它们不仅可以在这种方式定位,但缺乏财产索引,按键查明不会是无论如何的有效方法。
本文是一系列的一部分;如果您发现它有用,请考虑在标签,关系,超节点和分类变量上读取其他人。
(本文由闻数起舞翻译自David Allen的文章《Graph Data Modeling: All About Keys》,转载请注明出处,原文链接:https://medium.com/neo4j/graph-data-modeling-keys-a5a5334a1297)
Copyright © 2024 有趣生活 All Rights Reserve吉ICP备19000289号-5 TXT地图HTML地图XML地图