如何将List <CustomObject>保留为节点的属性?

Kri*_*wal 5 neo4j spring-data-neo4j-4 neo4j-ogm

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

@Property
List<xyz> listOfConditions
Run Code Online (Sandbox Code Playgroud)

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

有什么方法可以将对象列表持久保存到Neo4j的节点属性上吗?我正在使用neo4j-ogm嵌入式驱动程序和Spring-data-neo4j。

Ner*_*rve 5

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

任何原始,装箱的原始或String或其数组,本质上是自然适合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])
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@NodeEntity
class Node {
    @GraphId
    Long id;

    @Property
    String name

    @Convert(value = XYZConverter.class)
    XYZ xyz
}
Run Code Online (Sandbox Code Playgroud)

另一方面,这样做不是一个好习惯,因为理想情况下,您应该使用“ hasA”关系链接Node和XYZ。Neo4j旨在优化处理此类关系,因此最好发挥Neo4j的优势