【问题标题】:An effective way to lookup duplicate nodes in Neo4j 1.8?在 Neo4j 1.8 中查找重复节点的有效方法?
【发布时间】:2015-02-03 15:24:01
【问题描述】:

我正在尝试以编程方式定位 Neo4j 1.8 数据库中的所有重复节点(使用 Neo4j 1.8)。 需要检查的节点都有一个(非索引)属性externalId,我想为其查找重复项。这是我得到的 Cypher 查询:

            START n=node(*), dup=node(*) WHERE 
                HAS(n.externalId) AND HAS(dup.externalId) AND 
                n.externalId=dup.externalId AND 
                ID(n) < ID(dup) 
                RETURN dup

数据中的节点少于 10K,externalId 的节点少于 1K。 上面的查询正在运行,但似乎表现不佳。有没有更省内存的方法来做到这一点?

【问题讨论】:

    标签: performance neo4j cypher


    【解决方案1】:

    试试这个查询:

    START n=node(*)
    WHERE HAS(n.externalId)
    WITH n.externalId AS extId, COLLECT(n) AS cn
    WHERE LENGTH(cn) > 1
    RETURN extId, cn;
    

    它避免了节点的笛卡尔积。它找到不同的externalId 值,收集所有具有相同id 的节点,然后过滤掉不重复的id。结果中的每一行都将包含一个 externalId 和具有该 id 的重复节点的集合。

    【讨论】:

      【解决方案2】:

      开始子句包括一个完整的图扫描,然后组装整个节点集的笛卡尔积(10k * 10k = 100m 对开始),然后根据 where 中的标准缩小这个非常大的列表条款。 (也许这里有密码优化?我不确定)

      我认为在 externalId 上添加索引将是一个明显的胜利,并且现在可能会提供足够的性能提升,但您也可以查看以不同的方式查找重复项,可能是这样的:

      START n=node(*)
      WHERE HAS(n.externalId)
      WITH n
      ORDER BY ID(n) ASC 
      WITH count(*) AS occurrences, n.externalId AS externalId, collect(ID(n)) AS ids
      WHERE occurrences > 1
      RETURN externalId, TAIL(ids)
      

      【讨论】:

      • 您的第一个查询将不起作用,因为 ndup 将始终是同一个节点,因此 id(n) &gt; id(dup) 将始终为 false。
      • 当我尝试这个时,我收到一个错误,指出 字符串匹配正则表达式 `$' 预期但 `O' 找到
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      相关资源
      最近更新 更多