2015-11-07 45 views
0

我正在尝试使用graphAware的neo4j推荐引擎(https://github.com/graphaware/neo4j-reco)。我是新来了很多涉及的技术,但我明白我有我的推荐引擎建立后,我运行下面让我的建议:从Spring获取Neo4j节点查询结果

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对象。

回答

3

如果您以嵌入模式运行Neo4j,您将无法访问GraphDatabaseService

在您的Person实体中,您可以访问属于节点内部ID的GraphId属性。

所以,你可以在例如自定义RecommendationService,检索Node对象为这个ID:

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请求调用。您只能通过该人或他的ID的名称。

这里你可以看到一个例子:https://github.com/graphaware/recommendations-meetup

+0

是什么,如果我在服务器模式快到最好的方法?我只看到嵌入模式中引用的节点对象,它仅适用于嵌入模式吗? –

+0

如果您使用服务器模式,则需要向neo4j-reco插件的API端点发出http请求。 Neo4j-Reco是一个服务器插件,因此可以在服务器端运行,而不是像SDN4那样在应用程序端运行。我编辑了我的回答 –

+0

谢谢Christophe。这就是我所缺少的,我认为reco可以在应用程序方面工作,但完全丧失了这种工作方式。这个例子和你的解释清除了你建立的记录,并将其作为服务器的插件。 –