当执行Cypher查询以检索具有自同构的特定子图时,我们说
MATCH (a)-[:X]-(b)-[:X]-(c),
RETURN a, b, c
似乎默认行为是返回每个检索到的子图及其所有自同构。在该示例中,如果(u)-[:X]-(v)-[:X]-(w)是匹配该模式的图,则输出将是u,v,w以及w,v,u,它们包含在同一个图中。
是否有一种方法来检索每个子图只一次?
编辑:如果Cypher在搜索中有一个功能,使用某种对称破缺条件,因为它会减少计算时间,那就太好了。如果不是这种情况,您将如何后处理以找到所需的输出?
在您正在进行的查询中,(a)-[r:X]-(b)
和(a)-[t:X]-(c)
引用类似的模式。因为(b)和(c)可以互换。为什么需要重复匹配两次?MATCH (a)-[r:X]-(b) RETURN a, r, b
返回您正在查找的所有子图。
编辑
您可以执行以下操作来查找具有两种类型X
关系的节点。
MATCH (a)-[r:X]-(b) WHERE size((a)-[:X]-()) = 2 RETURN a, r, b
对于这种类型的镜像模式,我们可以在内部图id上添加限制,以便只保留两条路径中的一条:
MATCH (a)-[:X]-(b)-[:X]-(c)
WHERE id(a) < id(c)
RETURN a, b, c
这也将防止a = c
.