从 Spring 查询结果中获取 Neo4j 节点
Getting Neo4j Node from Spring query result
我正在尝试使用 graphAware 的 neo4j 推荐引擎 (https://github.com/graphaware/neo4j-reco)。我对所涉及的很多技术都不熟悉,但据我了解,在构建推荐引擎后,我 运行 通过以下方式获得我的推荐:
List<Recommendation<Node>> recoForVince = recommendationEngine.recommend(getPersonByName("Vince"), new SimpleConfig(2));
getPersonByName 的例子是这样的:
private Node getPersonByName(String name) {
return IterableUtils.getSingle(getDatabase().findNodes(DynamicLabel.label("Person"), "name", name));
}
问题是,据我所知,只有嵌入了您的 neo4j 服务器才有效。我们正在考虑将 spring 用于我们的 mvc 设置,并且我们将拥有类似的东西:
我们将通过以下方式获取数据:
@Repository
public interface PersonRepository extends GraphRepository<Person> {
@Query("MATCH (p:Person) WHERE m.name = {name} RETURN p")
Person findByTitleContaining(@Param("name") String name);
}
或者可能作为哈希图返回。我的问题是我不清楚如何将这些结果中的任何一个转换为 Graphaware 框架可用的 Node 对象,或者我应该如何获取 Node 对象。
如果您 运行 Neo4j 处于嵌入式模式,您无论如何都可以访问 GraphDatabaseService
。
在您的 Person
实体中,您可以访问 GraphId
属性,这是节点内部 ID。
因此,例如,在您的自定义 RecommendationService 中,您可以检索此 ID 的 Node
对象:
private final GraphDatabaseService database;
private final MyRecommendationEngine engine;
@Autowired
public RecommendationService(GraphDatabaseService database, MyRecommendationEngine engine) {
this.database = database;
this.engine = engine;
public List<Recommendation<Node>> processRecommendation(Person person) {
Node node = database.getNodeById(person.getId());
return engine.recommend(node);
}
请注意,这将 return Node
个对象,如果您想将它们转换为 Person
个实体,您需要自己处理水合作用。
如果您 运行 ServerMode 中的 Neo4j 并且 SDN4 在您的应用程序级别,那么最好是对 Neo4j-Reco 插件提供的端点进行 http 请求调用。您只能传递此人的姓名或他的 ID。
你可以在这里看到一个例子:https://github.com/graphaware/recommendations-meetup
我正在尝试使用 graphAware 的 neo4j 推荐引擎 (https://github.com/graphaware/neo4j-reco)。我对所涉及的很多技术都不熟悉,但据我了解,在构建推荐引擎后,我 运行 通过以下方式获得我的推荐:
List<Recommendation<Node>> recoForVince = recommendationEngine.recommend(getPersonByName("Vince"), new SimpleConfig(2));
getPersonByName 的例子是这样的:
private Node getPersonByName(String name) {
return IterableUtils.getSingle(getDatabase().findNodes(DynamicLabel.label("Person"), "name", name));
}
问题是,据我所知,只有嵌入了您的 neo4j 服务器才有效。我们正在考虑将 spring 用于我们的 mvc 设置,并且我们将拥有类似的东西:
我们将通过以下方式获取数据:
@Repository
public interface PersonRepository extends GraphRepository<Person> {
@Query("MATCH (p:Person) WHERE m.name = {name} RETURN p")
Person findByTitleContaining(@Param("name") String name);
}
或者可能作为哈希图返回。我的问题是我不清楚如何将这些结果中的任何一个转换为 Graphaware 框架可用的 Node 对象,或者我应该如何获取 Node 对象。
如果您 运行 Neo4j 处于嵌入式模式,您无论如何都可以访问 GraphDatabaseService
。
在您的 Person
实体中,您可以访问 GraphId
属性,这是节点内部 ID。
因此,例如,在您的自定义 RecommendationService 中,您可以检索此 ID 的 Node
对象:
private final GraphDatabaseService database;
private final MyRecommendationEngine engine;
@Autowired
public RecommendationService(GraphDatabaseService database, MyRecommendationEngine engine) {
this.database = database;
this.engine = engine;
public List<Recommendation<Node>> processRecommendation(Person person) {
Node node = database.getNodeById(person.getId());
return engine.recommend(node);
}
请注意,这将 return Node
个对象,如果您想将它们转换为 Person
个实体,您需要自己处理水合作用。
如果您 运行 ServerMode 中的 Neo4j 并且 SDN4 在您的应用程序级别,那么最好是对 Neo4j-Reco 插件提供的端点进行 http 请求调用。您只能传递此人的姓名或他的 ID。
你可以在这里看到一个例子:https://github.com/graphaware/recommendations-meetup