如何比较两个图的相等性
如果您想比较两个图(或子图)以确定它们是否等效,以下 Cypher 将生成节点和属性的 md5sum 以进行比较。例如,您可能希望将测试/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
当针对包含 38 个带有 Movie 标签的节点的默认电影图运行时,将返回以下内容:
md5_property 3f8d4737d078783e12f7cf57a207dd67
上述 Cypher 需要安装 apoc 存储过程集。
在上述示例中,我们正在检查所有带有标签 :Movie 的节点,并生成这些节点所有属性的 md5sum,然后使用该和生成一个 md5sum 哈希。
例如,如果 :Movie 节点有多个具有相同 title 属性的节点,并且由于上述 Cypher 按 n.title 排序,那么结果将按照找到的顺序传递给 md5 存储过程。这通常基于节点创建的顺序。如果您有两个带有 title='The Matrix'
的 :Movie 节点是使用以下 Cypher 创建的
CREATE (n:Movie {title:'The Matrix', genre:'Sci-Fi'})
CREATE (n1:Movie {title:'The Matrix', genre:'Action'})
那么简单地运行 Cypher 来生成 md5 哈希将产生一个 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 值,无论创建顺序如何,我们需要运行 Cypher,它将使用 ORDER BY 子句以确保的顺序返回数据
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 和,则可以证明这些节点在标签和属性的定义方面是相同的。
此页面有用吗?