Performance 查找Neo4j 1.8中重复节点的有效方法?
我正在尝试以编程方式定位Neo4j 1.8数据库中的所有重复节点(使用Neo4j 1.8)。 需要检查的节点都有一个(非索引的)属性Performance 查找Neo4j 1.8中重复节点的有效方法?,performance,neo4j,cypher,Performance,Neo4j,Cypher,我正在尝试以编程方式定位Neo4j 1.8数据库中的所有重复节点(使用Neo4j 1.8)。 需要检查的节点都有一个(非索引的)属性externalId,我想为其查找重复项。这是我得到的密码查询: START n=node(*), dup=node(*) WHERE HAS(n.externalId) AND HAS(dup.externalId) AND n.externalId=dup.externa
externalId
,我想为其查找重复项。这是我得到的密码查询:
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
START n=node(*),dup=node(*),其中
HAS(n.externalId)和HAS(dup.externalId)和
n、 externalId=dup.externalId和
ID(n)
数据中的节点少于10K个,外部ID为的节点少于1K个。
上面的查询正在运行,但似乎执行得不好。是否有一种内存消耗更少的方法来执行此操作?尝试以下查询:
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的重复节点。尝试以下查询:
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的重复节点。start子句包括一个完整的图形扫描,然后组装整个节点集的笛卡尔积(从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)
start子句包括一个完整的图形扫描,然后组装整个节点集的笛卡尔积(从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)
您的第一个查询将不起作用,因为n
和dup
将始终是同一个节点,因此id(n)>id(dup)
将始终是false。当我尝试此操作时,我得到一个错误,声明字符串与regex `$'匹配,但“O”发现您的第一个查询将不起作用,因为n
和dup
将始终是同一个节点,因此,id(n)>id(dup)
将始终为false。当我尝试此操作时,会出现一个错误,说明字符串应与正则表达式“$”匹配,但找到了“O”