如何将 List<CustomObject> 持久化为节点的 属性?

How to persist a List<CustomObject> as a property of a node?

我正在尝试保留 class 假设 xyz 的对象列表。当我在 NodeEntity Class:

中执行此操作时
@Property
List<xyz> listOfConditions

节点 table 当通过 Neo4jOperations.load(entity) 方法从 neo4j 数据库加载时,将 return 错误提示:- 将 GraphModel 映射到 NodeEntity 类型时出错 class.

在 Neo4j 中有什么方法可以将对象列表持久化到节点属性上吗?我正在使用 neo4j-ogm-embedded 驱动程序和 Spring-data-neo4j.

不,OGM 不支持在单个节点上表示为属性的嵌套对象。唯一的选择是编写自定义转换器以将嵌套对象序列化为字符串表示并将其存储为单个 属性。

否则,节点上的对象列表将被视为从节点到这些对象的关系。

这里有一个 link 手册以供进一步参考:http://neo4j.com/docs/ogm-manual/current/

Neo4j 不支持将另一个对象存储为嵌套 属性。 Neo4j-OGM 仅支持

any primitive, boxed primitive or String or arrays thereof, essentially anything that naturally fits into a Neo4j node property.

如果您想解决这个问题,您可能需要创建一个自定义类型转换器。例如,

import org.neo4j.ogm.typeconversion.AttributeConverter

class XYZ{
    XYZ(Integer x, String y) {
        this.x = x
        this.y = y
    }
    Integer x
    String y
}

public class XYZConverter implements AttributeConverter<XYZ, String> {

    @Override
    public String toGraphProperty(XYZ value) {
        return value.x.toString() + "!@#" + value.y
    }

    @Override
    public XYZ toEntityAttribute(String value) {
        String[] split = value.split("!@#")
        return new XYZ(Integer.valueOf(split[0]), split[1])
    }
}

然后您可以像这样用 @Convert 注释 @NodeEntity

@NodeEntity
class Node {
    @GraphId
    Long id;

    @Property
    String name

    @Convert(value = XYZConverter.class)
    XYZ xyz
}

另一方面,这不是一个好的做法,因为理想情况下,您应该 link Node 和 XYZ 具有 'hasA' 关系。 Neo4j 旨在以最佳方式处理此类关系,因此最好发挥 neo4j

的优势