遍历所有节点并将每个节点与其他节点进行比较
Traversing through all nodes and comparing each one with every other one
我正在做一个小项目,我有一个包含大约 6 万个节点和这些节点之间 50 万个关系的数据集。节点有两种类型。第一种是食谱,第二种是配料。食谱由以下成分组成:
(ingredient)-[:IS_PART_OF]->(recipe)
我的 objective 是找出两个食谱共有多少共同成分。我已经设法通过以下查询获得此信息,该查询将一个食谱与所有其他食谱(第一个与所有其他食谱)进行比较:
MATCH (recipe:RECIPE{ ID: 1000000 }),(other)
WHERE (other.ID >= 1000001 AND other.ID <= 1057690)
OPTIONAL MATCH (recipe:RECIPE)<-[:IS_PART_OF]-(ingredient:INGREDIENT)- [:IS_PART_OF]->(other)
WITH ingredient, other
RETURN other.ID, count(distinct ingredient.name)
ORDER BY other.ID DESC
我的第一个问题:如何以相互只计算一次的方式获取两个食谱的所有成分的数量(R1和R2的并集--> R1 U R2)
我的第二个问题:是否可以编写一个循环遍历所有食谱并检查常见成分? objective 是将 每个食谱与所有其他食谱进行比较 。我认为这应该 return (n-1)*(n/2) 行。
以上方法都试过了,问题依旧。即使使用 LIMIT
和 SKIP
我也无法 运行 整套代码。我已经更改了我的查询,因此它允许我相应地对我的集合进行分区:
MATCH (recipe1)<-[:IS_PART_OF]-(ingredient:INGREDIENT)-[:IS_PART_OF]->(recipe2)
WHERE (recipe2.ID >= 1000000 AND recipe2.ID <= 1000009) AND (recipe1.ID >= 1000000 AND recipe1.ID <= 1000009) AND (recipe1.ID < recipe2.ID)
RETURN recipe1.ID, count(distinct ingredient.name) AS MutualIngredients, recipe2.ID
ORDER BY recipe1.ID
在我得到一台更好的机器之前,这就足够了。
我的第一个问题还没解决:如何获取两个菜谱中所有食材的个数,并且相互只计算一次(R1和R2的并集--> R1 U R2 )
你需要玩这个,但它会是类似于这样的东西:
MATCH (recipe1:RECIPE)<-[:IS_PART_OF]-(ingred:INGREDIENT)-[:IS_PART_OF]->(recipe2:RECIPE)
WHERE ID(recipe1) < ID(recipe2)
RETURN recipe1, collect(ingred.name), recipe2
ORDER BY recipe1.ID
匹配模式为您提供了两个食谱之间的所有共同成分。 WHERE
子句确保您不会将食谱与其自身进行比较(因为它会与自身共享所有成分)。 return 子句仅提供您正在比较的两个食谱,以及它们的共同点。
虽然这将是 O(n^2),并且非常慢。
UPDATE 采纳了 Nicole 的建议,这是一个很好的建议。那应该保证每对只被考虑一次。
已解决: 仅供分享,如果其他人需要它:
MATCH (recipe1)<-[:IS_PART_OF]-(ingredient:INGREDIENT)-[:IS_PART_OF]->(recipe2)
MATCH (recipe1)<-[:IS_PART_OF]-(ingredient1:INGREDIENT)
MATCH (recipe2)<-[:IS_PART_OF]-(ingredient2:INGREDIENT)
WHERE (recipe2.ID >= 1000000 AND recipe2.ID <= 1000009) AND (recipe1.ID >= 1000000 AND recipe1.ID <= 1000009) AND (recipe1.ID < recipe2.ID)
RETURN recipe1.ID, count(distinct ingredient1.name) + count(distinct ingredient2.name) - count(distinct ingredient.name) AS RecipesUnion, recipe2.ID
ORDER BY recipe1.ID
我正在做一个小项目,我有一个包含大约 6 万个节点和这些节点之间 50 万个关系的数据集。节点有两种类型。第一种是食谱,第二种是配料。食谱由以下成分组成:
(ingredient)-[:IS_PART_OF]->(recipe)
我的 objective 是找出两个食谱共有多少共同成分。我已经设法通过以下查询获得此信息,该查询将一个食谱与所有其他食谱(第一个与所有其他食谱)进行比较:
MATCH (recipe:RECIPE{ ID: 1000000 }),(other)
WHERE (other.ID >= 1000001 AND other.ID <= 1057690)
OPTIONAL MATCH (recipe:RECIPE)<-[:IS_PART_OF]-(ingredient:INGREDIENT)- [:IS_PART_OF]->(other)
WITH ingredient, other
RETURN other.ID, count(distinct ingredient.name)
ORDER BY other.ID DESC
我的第一个问题:如何以相互只计算一次的方式获取两个食谱的所有成分的数量(R1和R2的并集--> R1 U R2)
我的第二个问题:是否可以编写一个循环遍历所有食谱并检查常见成分? objective 是将 每个食谱与所有其他食谱进行比较 。我认为这应该 return (n-1)*(n/2) 行。
以上方法都试过了,问题依旧。即使使用 LIMIT
和 SKIP
我也无法 运行 整套代码。我已经更改了我的查询,因此它允许我相应地对我的集合进行分区:
MATCH (recipe1)<-[:IS_PART_OF]-(ingredient:INGREDIENT)-[:IS_PART_OF]->(recipe2)
WHERE (recipe2.ID >= 1000000 AND recipe2.ID <= 1000009) AND (recipe1.ID >= 1000000 AND recipe1.ID <= 1000009) AND (recipe1.ID < recipe2.ID)
RETURN recipe1.ID, count(distinct ingredient.name) AS MutualIngredients, recipe2.ID
ORDER BY recipe1.ID
在我得到一台更好的机器之前,这就足够了。
我的第一个问题还没解决:如何获取两个菜谱中所有食材的个数,并且相互只计算一次(R1和R2的并集--> R1 U R2 )
你需要玩这个,但它会是类似于这样的东西:
MATCH (recipe1:RECIPE)<-[:IS_PART_OF]-(ingred:INGREDIENT)-[:IS_PART_OF]->(recipe2:RECIPE)
WHERE ID(recipe1) < ID(recipe2)
RETURN recipe1, collect(ingred.name), recipe2
ORDER BY recipe1.ID
匹配模式为您提供了两个食谱之间的所有共同成分。 WHERE
子句确保您不会将食谱与其自身进行比较(因为它会与自身共享所有成分)。 return 子句仅提供您正在比较的两个食谱,以及它们的共同点。
虽然这将是 O(n^2),并且非常慢。
UPDATE 采纳了 Nicole 的建议,这是一个很好的建议。那应该保证每对只被考虑一次。
已解决: 仅供分享,如果其他人需要它:
MATCH (recipe1)<-[:IS_PART_OF]-(ingredient:INGREDIENT)-[:IS_PART_OF]->(recipe2)
MATCH (recipe1)<-[:IS_PART_OF]-(ingredient1:INGREDIENT)
MATCH (recipe2)<-[:IS_PART_OF]-(ingredient2:INGREDIENT)
WHERE (recipe2.ID >= 1000000 AND recipe2.ID <= 1000009) AND (recipe1.ID >= 1000000 AND recipe1.ID <= 1000009) AND (recipe1.ID < recipe2.ID)
RETURN recipe1.ID, count(distinct ingredient1.name) + count(distinct ingredient2.name) - count(distinct ingredient.name) AS RecipesUnion, recipe2.ID
ORDER BY recipe1.ID