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
我在官方文档中看到的例子都是继承自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