В 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