4 Spring Data Neo4j

Wu Jun 2018-12-18 21:52:29
06 Spring > 05 Data.md

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> {}