从 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