从Spring查询结果中获取Neo4j节点

时间:2015-11-07 01:35:10

标签: spring-mvc neo4j graphaware

我尝试使用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);
}

或者可能作为Hashmap返回。我的问题是我不清楚如何将这些结果中的任何一个转换为可由Graphaware框架使用的Node对象,或者我应该如何获取Node对象。

1 个答案:

答案 0 :(得分:3)

如果您在嵌入模式下运行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);
}

请注意,这会返回Node个对象,如果您想将它们转换为您自己需要处理补水的Person个实体。

如果您在ServerMode中运行Neo4j并且SDN4处于您的应用程序级别,那么最好是对Neo4j-Reco插件提供的端点进行http请求调用。您只能传递Person的名称或他的id。

您可以在此处查看示例:https://pub.dartlang.org/packages/linter