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 是否支持该类型,在我的情况下,我没有提供 allowCast
为 true
,因此 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
中可用
是否可以将节点之间的关系值作为用户定义的 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 是否支持该类型,在我的情况下,我没有提供 allowCast
为 true
,因此 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