【问题标题】:How to store a map or json object as a property in neo4j?如何将地图或 json 对象存储为 neo4j 中的属性?
【发布时间】:2017-11-05 22:50:46
【问题描述】:

我正在尝试将地图或 json 对象作为属性存储在 Neo4j 中,但它不起作用。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    这是目前节点属性的限制。您有几种解决方法可供选择。

    1. 您可以将您的 json 对象转换为字符串并将其保存为属性。您可以使用 APOC Procedures 将 JSON 字符串与 Cypher 映射对象相互转换。

    2. 您可以将地图属性另存为节点上的属性,但这会丢失您从对象本身获得的分组。

    3. 如果 #2 还不够,您还可以更改图形模型,使 JSON 对象中的数据对应于与原始节点相关的图形对象、节点和属性。

    【讨论】:

    • 非常感谢。 T 获取数据时使用 apoc.convert.getJsonProperty() 转换为对象,存储数据时使用 apoc.convert.toJson(map)
    【解决方案2】:

    neo java OGM 库支持将地图存储为属性。如果您使用 @Properties 注释 java 类字段,该库将展开您的地图以图形节点属性。

    类:

    @NodeEntity
    public class DataNode {
    
        @GraphId
        private Long id;
    
        @Properties
        private Map<String, String> map = new HashMap<>();
    
        public Map<String, String> getMap() {
            return map;
        }
    
        public void setMap(Map<String, String> map) {
            this.map = map;
        }
    }
    

    如何在java中使用:

        DataNode data = new DataNode();
        data.getMap().put("testKey", "keyvalue");
        data.getMap().put("myKey", "key value for my key");
    

    它在 neo 中的外观:

    请注意,如果您最终使用带点“.”的映射键,则在从 neo => 嵌套映射加载实体时可能会产生奇怪的副作用。然后考虑更改@Properties 中的分隔符或更改键。

    【讨论】:

    • 我也尝试过同样的事情。但现在我无法从节点中删除该属性。因为它还没有得到 neo4j 成本规划器的支持。假设在您的情况下,您将如何从该节点中删除 map.myKey?
    • 感谢 pawan 确认问题。另一个故事是 OGM 如何处理嵌套地图,我的意思是地图的地图......
    猜你喜欢
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2021-11-04
    相关资源
    最近更新 更多