在Neo4J中将字符串转换为多维数组
我将数据从csv加载到Neo4J中。文件中的一列是数组数组,Neo4J现在将其视为一个大字符串。如何将其转换回数组 我的文件如下所示:在Neo4J中将字符串转换为多维数组,neo4j,cypher,Neo4j,Cypher,我将数据从csv加载到Neo4J中。文件中的一列是数组数组,Neo4J现在将其视为一个大字符串。如何将其转换回数组 我的文件如下所示: Id, name, reviews 1, item1, "[[date1, User1, Rating1], [date2, User2, Rating2], [date3, User3, Rating3]] " First Array: [date1, User1, Rating1],
Id, name, reviews
1, item1, "[[date1, User1, Rating1],
[date2, User2, Rating2],
[date3, User3, Rating3]] "
First Array:
[date1, User1, Rating1], //0
[date2, User2, Rating2], //1
[date3, User3, Rating3] //2
Second Array example:
// 0 , 1 , 2
[date1, User1, Rating1]
MATCH (n) RETURN n.reviews[2] (output: date3, User3, Rating3)
MATCH (n) RETURN n.reviews[2][0] (output: date3)
MATCH (n) RETURN n.reviews[1][1] (output: User2)
进入Neo4J:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///data/file.csv" AS line
CREATE(:Product{
Id:toInteger(line.Id),
name:toString(line.name),
reviews:line.reviews})
RETURN line
现在已加载review列,但它被视为一个大字符串
"[date1, User1, Rating1], [date2, User2, Rating2], [date3, User3, Rating3]"
有没有办法像这样将其拆分为两个阵列:
Id, name, reviews
1, item1, "[[date1, User1, Rating1],
[date2, User2, Rating2],
[date3, User3, Rating3]] "
First Array:
[date1, User1, Rating1], //0
[date2, User2, Rating2], //1
[date3, User3, Rating3] //2
Second Array example:
// 0 , 1 , 2
[date1, User1, Rating1]
MATCH (n) RETURN n.reviews[2] (output: date3, User3, Rating3)
MATCH (n) RETURN n.reviews[2][0] (output: date3)
MATCH (n) RETURN n.reviews[1][1] (output: User2)
我希望能够像这样访问我的数据:
Id, name, reviews
1, item1, "[[date1, User1, Rating1],
[date2, User2, Rating2],
[date3, User3, Rating3]] "
First Array:
[date1, User1, Rating1], //0
[date2, User2, Rating2], //1
[date3, User3, Rating3] //2
Second Array example:
// 0 , 1 , 2
[date1, User1, Rating1]
MATCH (n) RETURN n.reviews[2] (output: date3, User3, Rating3)
MATCH (n) RETURN n.reviews[2][0] (output: date3)
MATCH (n) RETURN n.reviews[1][1] (output: User2)
有什么方法可以做到这一点吗?使用APOC过程,您可以使用
APOC.convert.fromJsonList()
函数来转换列表,不过您需要确保数组中的每个子项都被引用,以便将它们解释为字符串
WITH "[['date1', 'User1', 'Rating1'], ['date2', 'User2', 'Rating2'], ['date3', 'User3', 'Rating3']]" as inputString
WITH apoc.convert.fromJsonList(input) as input
RETURN input[2][0] //returns 'date3'
请注意,APOC文档中目前缺少转换函数,但您可以通过在Neo4j浏览器中输入以下内容来引用这些函数及其签名:
CALL apoc.help('fromjson')
现在是坏消息
尽管您可以使用文本输入和参数以及从JSON字符串属性转换,但不能将嵌套列表用作节点或关系的属性,这只是属性实现的当前限制
也就是说,您的建模可能需要一些改进。我们建议您的评论使用单独的节点,而不是这种嵌套结构,因此类似于:
(:Product)-[:HAS_REVIEW]->(:Review)
MATCH (p:Product {id:12345})-[:HAS_REVIEW]->(r)
WITH p, collect(r) as reviews
...
其中:Review节点具有日期和评级,或者具有用户ID,或者与对产品进行评级的用户节点有关系
用法如下所示:
(:Product)-[:HAS_REVIEW]->(:Review)
MATCH (p:Product {id:12345})-[:HAS_REVIEW]->(r)
WITH p, collect(r) as reviews
...
此时,您有一个(无序的)审阅节点数组,可以进行索引访问以获取特定索引处的审阅,然后使用点表示法访问所需的一个或多个属性。如果您想要订购,您需要在collect()之前进行明确的订购,并且您需要一些东西来订购,可能是在审核日期。感谢您的帮助和提示。现在效果很好。