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