实体主要有两个,一个是【节点实体】 一个是【关系实体】
1.@NodeEntity
2.@RelationshipEntity
1.节点实体
package org.canaan.neo4j.graph.entity;
import lombok.Data;
import org.canaan.neo4j.graph.convert.MoneyConverter;
import org.neo4j.ogm.annotation.Id;
import org.neo4j.ogm.annotation.Labels;
import org.neo4j.ogm.annotation.NodeEntity;
import org.neo4j.ogm.annotation.Relationship;
import org.neo4j.ogm.annotation.typeconversion.Convert;
import org.neo4j.ogm.annotation.typeconversion.DateLong;
import java.util.Date;
import java.util.Set;
/**
* {@link @NodeEntity} label 不指定默认为 类名即: UserNode
*
* @author Canaan
* @date 2019/7/11 8:52
*/
@Data
@NodeEntity(label = "User")
public class UserNode {
public final static String LABEL_FOUNDER = "Founder";
public final static String LABEL_PLOUGH = "Plough";
public final static String LABEL_SONUZ = "Sonuz";
/**
* {@link @Id} 业务主键,唯一 可以使用 {@link @GeneratedValue} 生成
*
* @author Canaan
* @date 2019/7/11 12:47
*/
@Id
private Long userId;
//@Required 需要企业级neo4j
private String userName;
@DateLong //将日期类型转换为时间戳,或者用 @DateString 转换为String
private Date createTime;
@Convert(MoneyConverter.class)
private Long fundValue;
/**
* 在 @NodeEntity label 后追加 额外的标签
*
* @author Canaan
* @date 2019/7/11 11:56
*/
@Labels
private Set<String> labels;
/**
* 关系的指定默认是 【-->】
*
* @author Canaan
* @date 2019/7/11 14:31
*/
@Relationship(type = "SUPERIOR")
private UserNode parentNode;
//@PostLoad
//public void loadData() {
//当数据加载完成后,将调用该方法
// System.out.println("数据加载了");
//}
}
自定义类型转换器:
package org.canaan.neo4j.graph.convert;
import org.neo4j.ogm.typeconversion.AttributeConverter;
/**
* @author Canaan
* @date 2019/7/11 19:06
*/
public class MoneyConverter implements AttributeConverter<String, Integer> {
@Override
public Integer toGraphProperty(String value) {
return Integer.valueOf(value);
}
@Override
public String toEntityAttribute(Integer value) {
return value.toString();
}
}
实体的主要注解在: org.neo4j.ogm.annotation 包下
字段类型转换器注解在: org.neo4j.ogm.annotation.typeconversion 包下
注意:
1. 如果字段名为 【id】 面没有注解说明,那么默认返回的是 GraphId
2. NodeEntity type 的默认值为 类名 。
3.@Id 是业务上的,不是由neo4j 生成
文档:
2. 关系实体, 主要用于复杂的关系映射
package org.canaan.neo4j.graph.entity;
import lombok.Data;
import org.neo4j.ogm.annotation.*;
/**
* 用户隶属关系
*
* @author Canaan
* @date 2019/7/11 10:10
*/
@Data
@RelationshipEntity(type = Membership.TYPE)
public class Membership {
public final static String TYPE = "MEMBERSHIP";
@Id
@GeneratedValue
private Long relationshipId;
@StartNode
private UserNode startNode;
@EndNode
private UserNode endNode;
public Membership() {
}
public Membership(UserNode startNode, UserNode endNode) {
this.startNode = startNode;
this.endNode = endNode;
}
}
注意如果关系映射不正确,是无法级联查询其关系节点的
文档: