在cypher中查询模板?如何避免重复自己

时间:2014-04-02 19:27:23

标签: neo4j cypher

我的群组有许多查询,这些查询倾向于引用一类关系类型。因此,我们倾向于编写大量重复查询,如下所示:

match (n:Provenance)-[r:`input to`|triggered|contributed|generated]->(m:Provenance)
where (...etc...)
return n, r, m

问题在于重复一组不同的关系类型。我们真的在寻找一系列关系类型中的任何关系。有没有办法将一堆关系类型枚举成一组(“foo relations”),然后将其用作变量,以避免在许多查询中反复重复自己?当我们添加新的关系类型时,重复查询关系类型往往会产生问题;现在,通过代码库分发的许多查询都需要更新。

在单个查询中枚举所有可能的关系并不是什么大问题,但是当分布在数十(或数百)个查询中时,它开始变得难以管理和更新。这里推荐的解决方案模式是什么?查询模板?

1 个答案:

答案 0 :(得分:2)

目前这不是一个内置功能,但它似乎是一个有趣的功能。我鼓励你发布这个想法trello董事会:

https://trello.com/b/2zFtvDnV/public-idea-board

或许建议允许关系类型的参数:

MATCH (n)-[r:{types}]->(p)

当然,这使得查询引擎更难以提前优化查询。关系类型层次结构可以工作,但除非绝对必要,否则我们非常犹豫是否要向模型引入新的抽象。不过,非常欢迎提出改进建议!

现在,是的,像你建议的模板可以解决它。理想情况下,您将查询发送到neo,其中包含您感兴趣的所有关系类型,以及参数化的其他项目,以便进行最佳规划。所以要做到这一点,你需要做一些字符串替换,以便在发送之前将长序列的reltypes注入查询。