Neo4J 中节点之间关系的自定义数据类型或 HashMap

Custom datatype or HashMap for relationship between nodes in Neo4J

是否可以将节点之间的关系值作为用户定义的 class,或者它应该是原始数据类型。例如:

@RelationshipEntity(type = "ALIGNED_WITH")
public class AlignedWith {

    @GraphId
    private Long id;

    private Set<DeptEndorsement> deptEndorsement = new HashSet<>();

    @StartNode
    private Term startTerm;

    @EndNode
    private Term endTerm;

    // getters and setters

}


public class DeptEndorsement {

    private String deptName;
    private Integer endorsementCount;

    // getters and setters

}


@NodeEntity
public class Term {

    @GraphId
    private Long id;

    private String termName;

    @Relationship(type = "ALIGNED_WITH", direction = Relationship.OUTGOING)
    private List<AlignedWith> alignedWith = new ArrayList<>();

    public void addAlignedWith(AlignedWith alignedWith) {
        this.alignedWith.add(alignedWith);
    }

    // getters and setters

}

如果您观察到 DeptEndorsement 是一个自定义 class,我希望它作为关系的价值 AlignedWith

或者,是否可以有一个HashMap(例如:HashMap<String, Integer>)作为节点之间关系的值?

这些是我对这个问题的发现,Neo4J 支持的数据类型是:

布尔值、长整型、双精度、字符串、列表。可以进行类型转换的类型有 Short、Integer、Float(尽管您需要指定允许转换,检查下面的 if 条件)Ref. MapCompositeConverter.java

以下条件负责检查 Neo4J 是否支持该类型,在我的情况下,我没有提供 allowCasttrue,因此 java.lang.Integer 不是可施法:

if (isCypherType(entryValue) || (allowCast && canCastType(entryValue)))

private boolean isCypherType(Object entryValue) {
    return cypherTypes.contains(entryValue.getClass()) || List.class.isAssignableFrom(entryValue.getClass());
}

我从 java.lang.Integer 更改为 java.lang.Long,一切正常。您不能像我的情况那样使用自定义数据类型 DeptEndorsement

下面是我的关系的属性。

@Properties
private Map<String, Long> deptEndorsement = new HashMap<>();

@Properties 注释在 neo4j-ogm-core 3.0.0+ Ref: Compatibility

中可用