问题描述
在执行 Cypher 查询以检索具有自同构的特定子图时,比方说
MATCH (a)-[:X]-(b)-[:X]-(c),RETURN a,b,c
似乎默认行为是返回每个检索到的子图及其所有自同构。 在那个例子中,如果 (u)-[:X]-(v)-[:X]-(w) 是一个匹配模式的图,输出将是 u,v,w 也是 w,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,b
,
对于这种镜像模式,我们可以对内部图 id 添加一个限制,以便只保留两条路径之一:
MATCH (a)-[:X]-(b)-[:X]-(c)
WHERE id(a) < id(c)
RETURN a,b,c
这也将防止出现 a = c
的情况。