【问题标题】:Remove automorphisms of a cypher query output删除密码查询输出的自同构
【发布时间】:2021-01-25 10:25:41
【问题描述】:

当进行 Cypher 查询以检索具有自同构的特定子图时,假设

MATCH (a)-[:X]-(b)-[:X]-(c),
RETURN a, b, c

似乎默认行为是返回每个检索到的子图及其所有自同构。 在该示例中,如果 (u)-[:X]-(v)-[:X]-(w) 是与模式匹配的图,则输出将是 u,v,w 以及 w,v,u,它们包含在同一个图中。

有没有办法只检索每个子图一次?

编辑:如果 Cypher 具有在搜索中执行此操作的功能,使用某种对称破坏条件,那就太好了,因为它会减少计算时间。如果不是这种情况,您将如何进行后处理以找到所需的输出?

【问题讨论】:

  • 您可以尝试对结果进行排序并使用 DISTINCT。
  • 如果有办法在搜索中做到这一点会更好
  • 在搜索中?什么意思?

标签: neo4j cypher subgraph


【解决方案1】:

在您进行的查询中,(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

【讨论】:

  • 如果我想找到有两个关系 X 和 2 个独立节点的节点,我该怎么办?
  • @AlexisPister 更新了我的答案。
  • 谢谢,但没有更简单的方法吗?这似乎是一个简单的模式,但请求目前非常冗长
【解决方案2】:

对于这些镜像模式,我们可以对内部图 id 进行限制,以便只保留两条路径中的一条:

MATCH (a)-[:X]-(b)-[:X]-(c)
WHERE id(a) < id(c)
RETURN a, b, c

这也将防止a = c的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2018-07-16
    相关资源
    最近更新 更多