neo4j:纯字符串表示的整数列表

时间:2018-05-21 08:41:11

标签: neo4j cypher

上下文

我想从csv文件读入我的数据库并创建节点和连接。对于要创建的订单节点,要读取的字段之一是产品的填充列表(关系密钥),即看起来像"[123,456,789]",其中数字是产品ID。

现在将数据读入db我为订单和产品创建节点没有问题;经过另一次迭代我现在想要通过展开订单中的产品列表并链接到相应的产品来创建边缘。

如果我能够在Order节点的创建时将包含列表的字符串转换为int列表,那么最好是这样,这样对这些值进行简单循环并匹配Product-nodes就可以了。存储效率这会更好。)

问题

但是我无法弄清楚如何将所述字符串转换为包含整数的列表的所述格式。我为这个问题想出一个密码的所有尝试都失败了。我将在下面发布一些内容,从字符串l开始:

WITH '[123,456,789]' as l
WITH split(replace(replace(l,'[',''),']',''),',') as s
UNWIND s as ss
COLLECT(toInteger(ss) ) as k 
return k

WITH '[123,456,789]' as l
WITH split(replace(replace(l,'[',''),']',''),',') as s, [] as k
FOREACH(ss IN s| SET k = k + toInteger(ss) )
return k

这两个陈述都失败了。

修改

我找到了一个部分解决方案,但我不太满意,因为它仅适用于我手头的任务,但不能解决此列表转换的更普遍问题。

我发现可以创建一个空列表作为节点的属性,可以连续更新:

CREATE (o:Order {k: []})
WITH o, '[123,456]' as l
WITH o, split(replace(replace(l,'[',''),']',''),',') as s
FOREACH(ss IN s | SET o.k= o.k + toInteger(ss) )
RETURN o.k

strangly这只适用于节点的属性,但不适用于绑定变量(见上文)

2 个答案:

答案 0 :(得分:1)

您可以使用substring()修剪开头和结尾的括号。

这种方法允许您创建一个int列表:

WITH '[123,456,789]' as nums
WITH substring(nums, 1, size(nums)-2) as nums
WITH split(nums, ',') as numList
RETURN numList

您当然可以一次执行所有这些操作,然后UNWIND后续列表,将它们转换为int,并将它们与产品匹配:

WITH '[123,456,789]' as nums
UNWIND split(substring(nums, 1, size(nums)-2), ',') as numString
WITH toInteger(numString) as num
MATCH (p:Product {id:num})
...

修改

如果您只想将其转换为整数列表,则可以在获得字符串列表后使用list comprehension执行此操作:

WITH '[123,456,789]' as nums
WITH split(substring(nums, 1, size(nums)-2), ',') as numStrings
WITH [str in numStrings | toInteger(str)] as nums
...

答案 1 :(得分:0)

由于输入字符串看起来像一个有效的JSON对象,因此您可以简单地使用apoc.convert.fromJsonList中的APOC library函数:

WITH "[123,456,789]" AS l
RETURN apoc.convert.fromJsonList(l)