Neo4j存储库 - 使用动态where子句编写查询

时间:2013-11-02 14:43:56

标签: neo4j cypher spring-data-neo4j

我对Neo4j比较陌生,对使用spring在Neo4j中编写动态查询有疑问。 根据我的阅读,查询在扩展GraphRepository类的接口中使用@Query参数进行注释,动态参数作为参数提供。

但是我的要求是我必须动态生成where子句的数量。

For example,
@Query("match n where n.__type__='com.connectme.domain.Person' and n.age > {0} return n.id)
public List<Object> getPeopleWithAge(Integer age);//

我的查询也可以更改,其中年龄也可以小于某个值,在这种情况下,查询可以变为:

@Query("match n where n.__type__='com.connectme.domain.Person' and n.age > {0} and n.age <{1} return n.id)
public List<Object> getPeopleWithAge(Integer age1, Integer age2);//

以类似的方式,围绕age参数的许多子句可能导致where子句的变化。 我如何动态处理这个当前我只知道这种带注释的执行查询的方式。 我可以覆盖并编写自己的自定义查询吗?

1 个答案:

答案 0 :(得分:2)

您可以编写自己的自定义查询逻辑。首先,您创建一个包含自定义查询方法的额外接口,以便获得两个存储库接口

public interface YourRepository extends GraphRepository<SomeClass> implements YourRepositoryExtension{
    //inferred queries, annotated queries
}


public interface YourRepositoryExtension {
    EndResult<SomeClass> customQuery();
    Iterable<SomeClass> customTraversal();
}

然后你做了一个实现:

@Repository
public class YourRepositoryImpl implements YourRepositoryExtension {

    @Autowired
    private YourRepository yourRepository;

    @Override
    public EndResult<SomeClass> customQuery(){
        //your query logic, using yourRepository to make cypher calls.
        return yourRepository.query("START n.. etc.. RETURN n", <optional params>);
    }

    @Override
    public Iterable<SomeClass> customTraversal(){
        SomeClass startNode = yourRepository.findOne(123);
        return yourRepository.findAllByTraversal(startNode, <some custom traversal>);
    }
}