在节点或关系中添加地图作为属性

时间:2016-05-27 07:07:37

标签: neo4j cypher

有没有办法将地图添加为属性?我想在地址属性本身内存储地址行1,2等。

与此类似的东西 -

RETURN {address: {firstline:"a", secondline:"b"}, name:"ABC"}

但是当我在CREATE或SET中尝试这个时,它会给我错误。

我试过了 -

create (a:Person {name: "ABC", address: {firstline:"a", secondline:"b"}})

错误 -

Property values can only be of primitive types or arrays thereof

3 个答案:

答案 0 :(得分:3)

不,不支持嵌套数组,在图表中它也没有意义,因为你通常会将地址建模为与人不同的节点。

(person:Person {name:"ABC"})-[:CURRENT_ADDRESS]->(addr:Address {firstLine:"a", secondLine:"b"})

答案 1 :(得分:1)

可以not将地图添加为属性。您应该将Address创建为单独的节点,并使用relationship创建Person。或者将地址property array添加到Person,例如,

(a:Person {name: "ABC", address: ["a", "b"]})

当然,您稍后需要将该数组转换回应用程序中的某个位置以获取您最初想要的地图。

答案 2 :(得分:0)

您可以通过将嵌套映射序列化为json字符串并推送到node来执行此操作。如果您的要求是

 {address:{firstline:"a",secondline:"b"},name:"ABC"}

如果值不是neo4j中的有效类型,则迭代map,然后将其转换为json字符串。即你转换

 {firstline:"a",secondline:"b"}==>json string.

在密码中,它充当普通的字符串。它有效。     从节点反序列化属性检索数据到本机对象时。

这种方法的缺点是你需要反序列化每个属性,因为我们不知道一个值是普通字符串还是一个包含嵌套映射的json字符串。

所以我的解决方案是,当你转换为json字符串时,你会注意到哪些键被转换为json并将这些信息保存在具有特定键的节点中,例如:json_keys=['address']     只读时只转换json_keys数组中的那些键。

1)your map = {address: {firstline:"a", secondline:"b"}, name:"ABC"}
2)convert to json = {address: '{firstline:"a", secondline:"b"}', name:"ABC"}
3)note which keys are converted = {address: '{firstline:"a", secondline:"b"}', name:"ABC",json_keys=["address"]}