如何将List <customobject>保存为节点的属性?

时间:2016-09-05 06:08:53

标签: neo4j spring-data-neo4j-4 neo4j-ogm

我试图坚持一个类的对象列表,假设是xyz。当我在NodeEntity类中执行此操作时:

@Property
List<xyz> listOfConditions

通过Neo4jOperations.load(entity)方法从neo4j数据库加载时,Node表将返回错误说明: - 错误将GraphModel映射到NodeEntity类型类。

有没有办法将对象列表保存到Neo4j中的节点属性上?我正在使用neo4j-ogm嵌入式驱动程序和Spring-data-neo4j。

2 个答案:

答案 0 :(得分:4)

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

  

任何原始的盒装基元或字符串或其数组,   基本上任何自然适合Neo4j节点属性的东西。

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

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这样的@Convert注释@NodeEntity

@NodeEntity
class Node {
    @GraphId
    Long id;

    @Property
    String name

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

另一方面,这不是一个很好的做法,因为理想情况下你应该将Node和XYZ与'hasA'关系联系起来。 Neo4j的设计旨在最佳地处理这种关系,因此最好能够发挥neo4j的优势

答案 1 :(得分:3)

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

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

以下是手册的链接以供进一步参考:http://neo4j.com/docs/ogm-manual/current/