我正在使用 Java 驱动程序从 Neo4j 数据库获取数据。我有一个接收
Set<ChrRegion> chrRegions
的函数,然后我必须使用该参数来构建一个查询,例如(在伪代码中,我知道 chrRegions 不是数组):
MATCH ( g:Gene )
WHERE
g.chromosomeID = ${chRegions [ 0 ].id} AND g.chromosomeBegin >= ${chRegions [ 0 ].begin} AND g.chromosomeEnd <= ${chRegions [ 0 ].end}
OR g.chromosomeID = ${chRegions [ 1 ].id} AND g.chromosomeBegin >= ${chRegions [ 1 ].begin} AND g.chromosomeEnd <= ${chRegions [ 1 ].end}
AND ... // for all the element in chrRegions
(意味着基因属于指定染色体中的索引区域)
将此查询构建为字符串非常简单,但我想知道这是否是最有效的方法(我可能有很多用户登陆这种查询)。
在其他语言(Lucene、SQL、SPARQL)中,可以通过组装标记以编程方式构建查询,Neo4j 驱动程序中是否有类似的东西?我怀疑不是,因为
Query
类包含查询字符串及其参数,没有结构,并且 BOLT 驱动程序可能需要字符串版本。但我想检查一下是否有更多关于它的想法。
最有效(也是推荐)的方法是将映射数组作为 Cypher 参数(例如,
$chRegions
)传递给一个简单的静态 Cypher 查询,该查询仅迭代该数组。
例如(如果您在 chromosomeID
标签的
Gene
属性上有 index,这应该特别快):
UNWIND $chRegions AS r
MATCH (g:Gene)
WHERE r.id = g.chromosomeID AND
r.begin = g.chromosomeBegin AND
r.end = g.chromosomeEnd
RETURN g