Весна для neo4j, как внедрить Neo4jRepository - PullRequest
0 голосов
/ 27 июня 2019

Все примеры, которые я вижу в официальной документации, унаследованы от Neo4jRepository<T, Long> и не используются для инъекций.

И я также вижу, что запросы могут выполняться с аннотацией @Query("match...").Я не хочу запускать @Query, так как мне нужно построить запрос во время выполнения.

Как я могу внедрить что-то вроде Neo4jRepository и использовать в своих компонентах для выполнения запросов и тому подобное?

Спасибо

1 Ответ

1 голос
/ 30 июня 2019

В Spring Data Neo4j нельзя выполнять запросы, определенные во время выполнения, с помощью концепции Repository.Что вы можете сделать, это выполнить запросы CYPHER через Session, и здесь у вас есть два варианта:

1.Neo4j OGM

OGM - это библиотека отображения графов объектов, предоставляемая Neo4j.Короче говоря, вы можете создать Session через Neo4jSessionFactory и запускать запросы, в которых все преобразования из графических данных в ваши объекты находятся на месте, так же, как с Repository.

Вы можете инициализировать фабрику:

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

, а затем просто откройте сессию, когда вам это нужно:

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

Подробнее о Документация Neo4j и Spring Documentation

2.Драйверы Neo4j

Это аналогичный способ, как вы можете запросить SQL с помощью JDBCTemplate .Вы можете создать сеанс через 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

...