Spring 对于 neo4j 如何注入 Neo4jRepository

Spring for neo4j how to inject Neo4jRepository

我在官方文档中看到的例子都是继承自Neo4jRepository<T, Long>,没有注入

而且我还看到查询可以 运行 加上 @Query("match...") 注释。我不想 运行 @Query 因为我需要在 运行 时间内构建查询。

如何注入 Neo4jRepository 之类的东西并在我的 bean 中用于 运行ning 查询等?

谢谢

Spring Data Neo4j 中,您不能 运行 runtime-defined 通过 Repository 概念进行查询。你可以做的是通过 Session 进行 运行 CYPHER 查询,这里你有两个选择:

1。 Neo4j OGM

OGM 是 Neo4j 提供的 object-graph 映射库。简而言之,您可以通过 Neo4jSessionFactory 创建一个 Session,并且 运行 查询将所有图形数据都转换为您的对象,与 Repository.[= 相同22=]

你可以初始化工厂:

    private SessionFactory sessionFactory = new SessionFactory(configuration, "path.to.domains.package");

然后在需要时打开会话:

    public Session getNeo4jSession() {
        return sessionFactory.openSession();
    }

阅读更多关于Neo4j Documentation and Spring Documentation

2。 Neo4j 驱动程序

这与您可以使用 JDBCTemplate 查询 SQL 的方式类似。您可以通过 Driver 创建会话并从查询中获取原始数据。这是一个服务示例,可以帮助您执行简单的转换:

@Component
public class Neo4jBoltCypherExecutor implements CypherExecutor {

    @org.springframework.beans.factory.annotation.Value("${neo4j.bolt.url}")
    private String boltUrl;

    @org.springframework.beans.factory.annotation.Value("${neo4j.bolt.user}")
    private String user;

    @org.springframework.beans.factory.annotation.Value("${neo4j.bolt.pass}")
    private String pass;

    private Driver neo4jDriver;


    @PostConstruct
    public void postConstruct() {
        AuthToken token = (pass != null && !pass.isEmpty()) ? AuthTokens.basic(user, pass) : AuthTokens.none();
        neo4jDriver = GraphDatabase
                .driver(boltUrl, token, Config.build().withEncryptionLevel(Config.EncryptionLevel.NONE)
                .toConfig());
    }

    @Override
    public List<Map<String, Object>> run(String query, Map<String, Object> params) {
        try (Session session = neo4jDriver.session()) {
            return session.run(query, params).list(r -> r.asMap(Neo4jBoltCypherExecutor::convert));
        }
    }


    static private Object convert(Value value) {
        switch (value.type().name()) {
            case "PATH":
                return value.asList(Neo4jBoltCypherExecutor::convert);
            case "NODE":
            case "RELATIONSHIP":
                return value.asMap();
        }
        return value.asObject();
    }
}

阅读更多关于Neo4j Documentation