【问题标题】:Cypher - Number ordered relationshipCypher - 数字有序关系
【发布时间】:2018-06-07 13:42:55
【问题描述】:

我偶然发现了一个密码查询。我想创建一个关系,其中有一个基于每条指令的整数属性的隐式顺序。例如,当 WHERE 条件适用时,我想将 address_1 匹配到 address_2,将 address_2 匹配到 address_3,依此类推。这是尝试的声明:

MATCH (i:Instruction), (i2:Instruction)
 WHERE i.address < i2.address AND i.vars_written = i2.vars_read
MERGE (i)-[r:USED_BY]->(i2)
RETURN i, i2, r

问题在于,编号较小的地址将映射到符合 WHERE 条件的所有其他地址,而不是仅映射到相关地址 - 在不应该存在的地方创建额外的关系,例如 address_1 到 address_3。

一条指令可能有多个 USED_BY 关系,但一旦另一条指令具有相同的 vars_written 属性,它应该开始一个新的 USED_BY 关系。

为了提供一个具体的例子,考虑以下 4 个节点:

Index 1 parameters: {
  address: 1
  vars_written: var_b
  vars_read: var_a
}

Index 2 parameters: {
  address: 2
  vars_written: var_c
  vars_read: var_b
}

Index 3 parameters: {
  address: 3
  vars_written: var_c      <- Same vars_written as Index 2
  vars_read: var_b
}

Index 4 parameters: {
  address: 4
  vars_written: var_e   
  vars_read: var_c         <- var_c was overwritten in Index 3, should NOT map to Index 2
}

生产:

1 -[USED_BY]-> 2
1 -[USED_BY]-> 3
2 -[USED_BY]-> 4   (This should not be made because 3 should only map to 4!)
3 -[USED_BY]-> 4

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    感谢 Neo4J 团队在他们的 Slack 频道上的回答:

    MATCH (i:Instruction), (i2:Instruction)
     WHERE i.address < i2.address AND i.vars_written = i2.vars_read
    WITH i, i2 ORDER BY i2.address ASC // <-- order the i2 by it's address
    WITH i, head(collect(i2)) as i2 // <-- collect all of the matches and take the first
    MERGE (i)-[r:USED_BY]->(i2)
    RETURN i, i2, r
    

    【讨论】:

      猜你喜欢
      • 2023-01-22
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多