知识库

如何比较两个图是否相等

如果您想比较两个图(或子图)以确定它们是否等价,下面的 Cypher 将生成节点及属性的 md5 校验和以进行比较。例如,您可能想比较测试/QA 实例与生产实例。

Neo4j 3.1 前向

MATCH (n:Movie)
WITH n
ORDER BY n.title
WITH collect(properties(n)) AS propresult
RETURN apoc.util.md5(propresult);

3.1 之前

MATCH (n:Movie)
WITH n
ORDER BY n.title
WITH collect(properties(n)) AS propresult
CALL apoc.util.md5(propresult) YIELD value AS md5_property
RETURN md5_property

当针对默认的 Movie 图运行时,该图包含 38 个带有 Movie 标签的节点,返回如下

md5_property
3f8d4737d078783e12f7cf57a207dd67

上述 Cypher 需要安装 apoc 存储过程 集合。

在上面的示例中,我们检查所有带有标签 :Movie 的节点,并生成这些节点所有属性的 md5 校验和,使用该校验和生成一个 md5sum 哈希

为了获得正确的结果,我们需要按每个节点都定义且唯一的属性值对节点进行排序。因此,您可能希望使用已定义为 属性存在约束唯一属性约束 的属性。

例如,如果 :Movie 节点中有多个节点具有相同的 title 属性,并且上述 Cypher 按 n.title 排序,那么结果会按发现的顺序传递给 md5 存储过程。这通常取决于节点的创建顺序。如果您有两个 :Movie 节点,其 title='The Matrix' 使用以下 Cypher 创建

CREATE (n:Movie {title:'The Matrix', genre:'Sci-Fi'})
CREATE (n1:Movie {title:'The Matrix', genre:'Action'})

那么,仅运行生成 md5 哈希的 Cypher 将得到如下的 md5_property

md5_property
5bc18a680ef59ba09466da4217166d30

然而,如果您颠倒 CREATE 语句的顺序,如下所示

CREATE (n1:Movie {title:'The Matrix', genre:'Action'})
CREATE (n:Movie {title:'The Matrix', genre:'Sci-Fi'})

相同的 md5 哈希 Cypher 的结果将产生不同的 md5_property

md5_property
c3c565b45457d2182731050e0cbab221

在上述示例中,为了获得正确的 md5 值且不受创建顺序影响,我们需要运行使用 ORDER BY 子句保证返回数据顺序的 Cypher

MATCH (n:Movie)
WITH n
ORDER BY n.name, n.genre
WITH collect(properties(n)) AS propresult
CALL apoc.util.md5(propresult) YIELD value AS md5_property
RETURN md5_property

它将始终返回

md5_property
c3c565b45457d2182731050e0cbab221
此外,我们不能简单地 collect(n)(即整个节点),因为它内部包含内部节点 ID(唯一的内部标识符)。

如果您在两个独立的环境中运行相同的 Cypher 并获得相同的 md5 校验和,则可以证明这些节点在标签和属性的定义上是相同的。

© . This site is unofficial and not affiliated with Neo4j, Inc.