我有一些包含字符串字段的节点。这个字符串字段是一个 pk 列表,每个 pk 代表另一个节点的 pk。我想遍历这个字符串列表并将所有 pk 转换为它们各自的名称。例如:
MATCH (r:Recipe) RETURN r.ingredients_list AS ingredients_list LIMIT 1;
可能会返回:
ingredients_list |
---|
“成分:8572629、1049724、0494828、0598371、6168492、0986423” |
我想把它转换成这个:
ingredients_list |
---|
“成分:面粉、牛奶、鸡蛋、黄油、小苏打、糖” |
到目前为止,我已经设法获取字符串列表并将其拆分为一个数组:
WITH "Ingredients: " AS s MATCH (r:Recipes) WHERE r.ingredients_list ~= "Ingredients: .*"
WITH SPLIT(SUBSTRING(r.ingredients_list, SIZE(s), SIZE(r.ingredients_list)), ",")
AS string_arrays RETURN string_arrays;
string_arrays |
---|
[“8572629”、“1049724”、“0494828”、“0598371”、“6168492”、“0986423”] |
而且我可以单独将每个 pk 与其对应的成分节点匹配并提取名称:
MATCH (g:Ingredient) WHERE g.pk = "0494828" RETURN g.name;
但是我对如何遍历这些字符串数组感到困惑。我相信我想要像 reduce
函数那样循环遍历每个子数组,查询 :Ingredient 节点以找到正确的名称,然后进行字符串连接以再次将所有内容放入字符串中。但是累加器似乎只在节点上运行。 Neo 的 FOREACH
也是如此。
是否有循环遍历字符串数组元素的函数?或者其他一些 Neo 函数对字符串数组的所有元素而不是节点数组执行操作?
答案 0 :(得分:0)
您可能正在寻找UNWIND
。
使用 UNWIND
,您可以将任何列表转换回单独的行。这些列表可以是传入的参数、以前 collect
编辑的结果或其他列表表达式。
https://neo4j.com/docs/cypher-manual/4.3/clauses/unwind/
使用 UNWIND
,您可以将 string_arrays
变成单独的行,执行 MATCH
来查找名称,最后将名称聚合为一个列表:
UNWIND string_arrays AS pk
MATCH (g:Ingredient) WHERE g.pk = pk
RETURN collect(g.name) AS names
但是,如果您已经有多个带有 MATCH (r:Recipe)
的行,这可能会混淆列表。因此,您可能需要在 subquery 中调用 UNWIND
:
WITH "Ingredients: " AS s
MATCH (r:Recipes) WHERE r.ingredients_list ~= "Ingredients: .*"
WITH split(substring(r.ingredients_list, size(s), size(r.ingredients_list))) AS string_arrays
CALL {
WITH string_arrays
UNWIND string_arrays AS pk
MATCH (g:Ingredient) WHERE g.pk = pk
RETURN collect(g.name) AS names
}
RETURN names
答案 1 :(得分:0)
WITH "Ingredients: " AS s
MATCH (r:Recipes) WHERE r.ingredients_list ~= "Ingredients: .*"
// carry along the r to keep the recipes apart
WITH r,split(substring(r.ingredients_list, size(s), size(r.ingredients_list))) AS string_arrays
UNWIND string_arrays AS pk
MATCH (g:Ingredient) WHERE g.pk = pk
// return the Recipes node (or just its id) and the ingredient names
RETURN r,collect(g.name) AS names