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

时间:2018-01-28 03:30:25

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

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

@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是我希望作为关系AlignedWith的值的自定义类

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

1 个答案:

答案 0 :(得分:0)

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

Boolean,Long,Double,String,List。可以类型化的类型是Short,Integer,Float(尽管你需要指定允许转换,如果条件,请检查下面的内容)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 3.0.0 + Ref: Compatibility

中提供了

neo4j-ogm-core注释