1 配置Spring Data Neo4j
启用 @EnableNeo4jRepositories 注解,扩展 Neo4jConfiguration,声明 GraphDatabaseService bean
@Configuration
@EnableNeo4jRepositories(basePackages="orders.db")
public class Neo4jConfig extends Neo4jConfiguration {
public Neo4jConfig() {
setBasePackage("orders");
}
@Bean(destroyMethod="shutdown")
public GraphDatabaseService graphDatabaseService() {
return new GraphDatabaseFactory()
.newEmbeddedDatabase("/tmp/graphdb");
}
}
依赖 spring-data-neo4j-rest 库配置 GraphDatabaseService
@Bean(destroyMethod="shutdown")
public GraphDatabaseService graphDatabaseService(Environment env) {
return new SpringRestGraphDatabase(
"http://graphdbserver:7474/db/data/",
env.getProperty("db.username"), env.getProperty("db.password"));
}
2 注解图实体
注 解 | 描 述 |
---|---|
@NodeEntity | 将 Java 类型声明为节点实体 |
@RelationshipEntity | 将 Java 类型声明为关联关系实体 |
@StartNode | 将某个属性声明为关联关系实体的开始节点 |
@EndNode | 将某个属性声明为关联关系实体的结束节点 |
@Fetch | 将实体的属性声明为立即加载 |
@GraphId | 将某个属性设置为实体的 ID 域(这个域的类型必须是 Long) |
@GraphProperty | 明确声明某个属性 @GraphTraversal 声明某个属性会自动提供一个 iterable 元素, 这个元素是图遍历所构建的 |
@Indexed | 声明某个属性应该被索引 |
@Labels | 为 @NodeEntity 声明标签 |
@Query | 声明某个属性会自动提供一个 iterable 元素,这个元素是执行给定的 Cypher 查询所构建的 |
@QueryResult | 声明某个 Java 或接口能够持有查询的结果 |
@RelatedTo | 通过某个属性, 声明当前的 @NodeEntity 与另外一个 @NodeEntity 之间的关联关系 |
@RelatedToVia | 在 @NodeEntity 上声明某个属性,指定其引用该节点所属的某一个 @RelationshipEntity |
@RelationshipType | 将某个域声明为关联实体类型 |
@ResultColumn | 在带有 @QueryResult 注解的类型上,将某个属性声明为获取查询结果集中的某个特定列 |
@NodeEntity
public class Order {
@GraphId
private Long id;
private String customer;
private String type;
@RelatedTo(type="HAS_ITEMS")
private Set<Item> items = new LinkedHashSet<Item>();
...
}
3 使用 Neo4jTemplate
@Autowired
private Neo4jOperations neo4j;
Order order = ...;
Order savedOrder = neo4j.save(order);
Order order = neo4j.findOne(42, Order.class);
EndResult<Order> allOrders = neo4j.findAll(Order.class);
long orderCount = count(Order.class);
neo4j.delete(order);
Order order = ...;
Product prod = ...;
LineItem lineItem = neo4j.createRelationshipBetween(order, prod, LineItem.class, "HAS_LINE_ITEM_FOR", false);
lineItem.setQuantity(5);
neo4j.save(lineItem);
4 创建自动化的 Neo4j Repository
public interface OrderRepository extends GraphRepository<Order> {}