Neo4j foreach 子句循环遍历字符串数组的元素

时间:2021-07-13 13:41:32

标签: arrays string loops neo4j cypher

我有一些包含字符串字段的节点。这个字符串字段是一个 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 函数对字符串数组的所有元素而不是节点数组执行操作?

2 个答案:

答案 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