Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Neo4J中将字符串转换为多维数组_Neo4j_Cypher - Fatal编程技术网

在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],

我将数据从csv加载到Neo4J中。文件中的一列是数组数组,Neo4J现在将其视为一个大字符串。如何将其转换回数组

我的文件如下所示:

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()之前进行明确的订购,并且您需要一些东西来订购,可能是在审核日期。

感谢您的帮助和提示。现在效果很好。