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



我有一些包含字符串字段的节点。该字符串字段是pk的列表,每个pk表示另一个节点的pk。我想循环浏览这个字符串列表,并将所有pk转换为它们各自的名称。例如:

MATCH (r:Recipe) RETURN r.ingredients_list AS ingredients_list LIMIT 1;

可能会返回这个:

ingredients_list
"成分:8572629、1049724、0494828、0598371、6168492、0986423">

您可能正在查找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)的行,这可能会混淆列表。因此,您可能需要在子查询中调用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
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

最新更新