我正在研究用户动态请求目标节点标签的用例。所以我的查询是这样的
MATCH(x)-[:{relationship}]->(y:{label})
我使用的是spring-data-neo4j,我想在引擎盖下使用org.neo4j.ogm.session.Session
。
session.query(query, params)
我知道params map用于在运行时替换params并出于性能原因使用相同的查询模板。
但是如何使用参数来替换MATCH
子句中的变量。不确定这是否是一些奇怪的用例。但{label}
是我根据请求得到的东西。
我该如何解决这个问题。
P.S:在查询之前我可以String.format
。还有更好的方法吗?
干杯!
答案 0 :(得分:3)
Neo4j不允许参数化标签和关系类型。
您可以使用labels(n)
和type(r)
函数来使用查询参数。
MATCH (x)-[r]->(y)
WHERE type(r) = {relationship} AND {label} in labels(y)
...
当存在大量不同类型的关系时,这将表现不佳(Neo4j需要扫描并过滤节点的所有关系,对于[r:TYPE]
,它只会遍历给定类型的关系。)
通常最好的选择是在运行时构造查询 - 只需确保已清理输入值以避免 cypher injection (类似于SQL注入)。