【发布时间】:2015-07-05 13:20:21
【问题描述】:
我正在做一个小项目,我有一个包含大约 6 万个节点和这些节点之间的 50 万个关系的数据集。节点有两种类型。第一种是食谱,第二种是成分。食谱由以下成分组成:
(ingredient)-[:IS_PART_OF]->(recipe)
我的目标是找出两个食谱共有多少共同成分。我已设法通过以下查询获取此信息,该查询将一个配方与所有其他配方进行比较(第一个配方与所有其他配方):
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)
我的第二个问题:是否可以编写一个循环来遍历所有食谱并检查常见成分?目标是将每个配方与所有其他配方进行比较。我认为这应该返回 (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)
【问题讨论】:
标签: neo4j cypher graph-databases