Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 查找Neo4j 1.8中重复节点的有效方法?_Performance_Neo4j_Cypher - Fatal编程技术网

Performance 查找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

我正在尝试以编程方式定位Neo4j 1.8数据库中的所有重复节点(使用Neo4j 1.8)。 需要检查的节点都有一个(非索引的)属性
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”