2017-06-22 50 views
0

我正在处理用户动态请求目标节点标签的用例。所以我的查询是类似于 MATCH(x)-[:{relationship}]->(y:{label}) 我使用的是spring-data-neo4j,我猜测它使用的是org.neo4j.ogm.session.Session替换MATCH子句中的变量

session.query(query, params) 

据我所知,PARAMS地图用于能够在运行时替换参数,并使用相同的查询模板出于性能原因。 但我如何使用参数来替换MATCH子句中的变量。不知道这是不是一个奇怪的用例。但{label}是我得到每个请求的基础。

我该如何解决这个问题。

P.S:在查询之前我可以做String.format。有没有更好的办法?

干杯!

回答

3

Neo4j不允许参数化标签和关系类型。

您可以使用labels(n)type(r)函数来使用查询参数。

MATCH (x)-[r]->(y) 
WHERE type(r) = {relationship} AND {label} in labels(y) 
... 

这将执行时较差有大量不同类型的关系(Neo4j的需要扫描和过滤的节点的所有的关系,为[r:TYPE]它将穿过给定类型的唯一关系)的。

因此,最好的选择是在运行时构建查询 - 只要确保已经过输入值的清理,以避免密码注入(类似于SQL注入)。