将动态数组存储在Neo4J节点属性中

时间:2015-11-10 14:11:43

标签: neo4j cypher

我正在尝试使用Neo4J在节点中存储动态json数组。

MATCH (n:Users) 
WHERE n.email = 'a@a.com' 
SET n.rated = [{email: 'b@b.com', date: '09/11/2015'}, 
               {email: 'c@c.com', date: '09/11/2015'}]  
RETURN n

另外,阅读帖子:http://plnkr.co/edit/84ExEb2CVBaW5prReQ7h?p=preview我只想尝试:

MATCH (n:Users) 
WHERE n.email = 'a@a.com' 
SET n.rated = [['b@b.com','09/11/2015'],
               ['c@c.com','09/11/2015']] 
RETURN n

但我收到错误:Collections containing mixed types can not be stored in properties.

是否可以在节点属性中设置json结果或数组?

2 个答案:

答案 0 :(得分:4)

您不能在节点中嵌套复杂数据。在您的情况下,您尝试存储嵌套的文档数组,然后尝试一组数组。您可能只有基本类型的数组(例如,字符串数组或整数数组)。

编辑只是添加这个,因为使用图形数据库(特别是Neo4j)似乎有些混乱。要处理您尝试存储在数组中的嵌套数据的类型,您可以简单地将每个嵌套对象存储为自己的节点,并将关系返回到原始节点(例如[:RATED])。这将允许您在每个其他节点上拥有整个属性列表(电子邮件,日期),然后您就可以查询此数据,因为您可以查询示例的根节点中的任何数据。 / p>

答案 1 :(得分:1)

正如@ david-makogon所述,这是无法做到的。我不会在这里重复他的回答。

我之前通过将JSON存储为字符串来实现此目的。

MATCH (n:Users) 
WHERE n.email = 'a@a.com' 
SET n.rated = "[{email: 'b@b.com', date: '09/11/2015'}, 
               {email: 'c@c.com', date: '09/11/2015'}]"
RETURN n

这将存储您想要的结果,但在检索时可能需要一些操作。这可能符合您的要求,也可能不符合您的要求。

我已根据需要使用序列化/反序列化来使用此方法。