Cypher/Neo4j,以编程方式编写过滤器子句的最有效方法是什么?

问题描述 投票:0回答:1

我正在使用 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 驱动程序可能需要字符串版本。但我想检查一下是否有更多关于它的想法。

neo4j cypher opencypher
1个回答
0
投票

最有效(也是推荐)的方法是将映射数组作为 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
© www.soinside.com 2019 - 2024. All rights reserved.