【问题标题】:Store dynamic array in a Neo4J node property在 Neo4J 节点属性中存储动态数组
【发布时间】:2015-11-10 14:11:43
【问题描述】:

我正在尝试使用 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

另外,阅读帖子:Cypher query JSON formated result 我只是在尝试:

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 结果或数组?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

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

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

    【讨论】:

    • 基于@ceej 的答案是可能的。我测试了它并且它正在工作。 [stackoverflow.com/questions/33631958/…
    • 当然,您可以将任何您想要的内容存储为字符串。但现在它不可查询。
    • 而且,如果我存储一个像 ["a","b","c"] 这样的简单数组,它是可查询的吗?
    • 是的,支持数字、字符串和布尔值数组
    • 这应该是正确的答案,因为它提倡与 Neo4j 一起使用的正确方法。
    【解决方案2】:

    正如@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
    

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

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

    【讨论】:

    • 虽然这可能有效,但它完全绕过了 Neo4j 的优势,因为您无法在该字符串中搜索内容,除非您检索并搜索它。
    • 正确,具体取决于您的场景和您想要实现的目标。通常我不会推荐它,而是会尝试对我的图表进行建模以表示所需的场景。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多