Neo4j:有人可以为我"translate"这个代码片段吗?



如果我没有遵循这里的最佳实践,我很抱歉,但我就是无法理解(因此当然也不会在新版本的Neo4j中重新创建(这个片段应该做什么:(

出于兴趣,我在Neo4j开始了我的旅程,并结束了介绍课程,并想重新创建一些项目,以更流畅地使用这项有趣的技术。但我无法从";正在烹饪什么"示例:

// Construct lists of node ids of ingredients, 
// grouped by node ids of recipes 
MATCH (r:Recipe)-[:CONTAINS_INGREDIENT]->(ingredient)
WITH {item:id(r), categories: collect(id(ingredient))} as userData
WITH collect(userData) as data
CALL algo.similarity.jaccard.stream(data)
YIELD item1, item2, count1, count2, intersection, similarity
// Look up nodes by node id
WITH algo.asNode(item1) AS from, 
algo.asNode(item2) AS to, 
similarity, intersection 
RETURN from.name, from.id, to.name, to.id, intersection, similarity
ORDER BY similarity DESC
LIMIT 20

当我尝试用gds.nodeSimilability.stream更新过时的algoro.similability.jaccard((,以及用gds.asNode((更新algor.asNode(([/em>时,在YILD语句之后,我仍然失败,控制台告诉我,它只是找不到项1(因此也找不到项2(。

编辑:我运行的是Neo4j版本4.2.5和GDS 1.5.2

我希望有人能帮助我了解出了什么问题!

BR,Dan

您的示例来自旧的算法库,而不是当前的GDS库,这是正确的。下面是示例代码正在执行的操作的分解。

首先将食谱与它们所含的成分进行匹配。

// Construct lists of node ids of ingredients, 
// grouped by node ids of recipes 
MATCH (r:Recipe)-[:CONTAINS_INGREDIENT]->(ingredient)

在这一点上,我们有一个由成对的r节点(用于配方(和ingredient节点(用于配料(组成的高结果集。

WITH {item:id(r), categories: collect(id(ingredient))} as userData

现在我们已经转换了结果,这样每个食谱就有一个地图。映射有两个键值对。item键指向配方节点的id。categories键指向配料节点的所有id的列表。

WITH collect(userData) as data

我们再次将结果从多行(每行一个映射(转换为单行。此行包含一个名为data的列表,其中包含所有映射。这是algor.similarity.jaccard.stream期望作为输入的格式。现在我们可以调用算法了。

CALL algo.similarity.jaccard.stream(data)
YIELD item1, item2, count1, count2, intersection, similarity

该算法输出item1和item2。这些是Neo4j的内部节点ID。这些id在Neo4j之外没有任何意义,所以我们想通过调用algo.asNode将它们转换回节点

// Look up nodes by node id
WITH algo.asNode(item1) AS from, 
algo.asNode(item2) AS to, 
similarity, intersection 

现在我们可以返回我们感兴趣的节点属性

RETURN from.name, from.id, to.name, to.id, intersection, similarity
ORDER BY similarity DESC
LIMIT 20

要在当前的Graph Data Science库中执行类似操作,可以使用节点相似性算法。GDS算法接受内存中的图形投影作为输入,而不是期望映射列表。创建一个名为recipe-graph的内存图,其中包含RecipeIngredient节点以及CONTAINS_INGREDIENT关系。

CALL gds.graph.create('recipe-graph', ["Recipe", "Ingredient"], 'CONTAINS_INGREDIENT')

然后,将该图传递给nodeSimilarity算法。

CALL gds.nodeSimilarity.stream('recipe-graph')
YIELD node1, node2, similarity
WITH gds.util.asNode(node1) AS r1, 
gds.util.asNode(node2) AS r2, similarity
WHERE r1:Recipe and r1:Recipe
RETURN r1.name as recipe1, r2.name as recipe2, similarity
ORDER BY similarity DESCENDING, r1.name, r2.name
LIMIT 20

最后,放下您创建的内存中的图形。

CALL gds.graph.drop('recipe-graph')

如果您不想创建和删除命名图,也可以在匿名图上调用算法。

最新更新