我一直在为 c# 使用带有 neo4j 客户端的WithParams,但 withParams 不适用于标签或关系类型。
我当时想到的替代方法是连接我想要基于某个标签作为参数形成的字符串,然后构造密码查询。那是:
string optionalMatchString = $"p =(n1)-[{relationshipsString}]-(n2)";
graphClient.Cypher.Match("(n1)")
.Where((Node n1) => n1.Identifier == identifier)
.OptionalMatch(optionalMatchString)
你可以猜到,relationshipString 是传递给我的一个参数。如果我使用 WithParams 查询将不会替换参数,所以现在我连接字符串,但这很容易受到攻击......(是吗?)
这是我看到的一个例子:
CALL db.labels() yield label
call apoc.cypher.run("MATCH (n:`"+label+"`) RETURN keys(n) as keys LIMIT 1",{}) yield value as row
RETURN label, row.keys as keys
显然,有一个称为 APOC 的程序cypher.run
,我可以在其中将我的标签(或相关的关系)作为变量(来自参数),但据我所见,它们只是连接一个字符串......所以是一样的我一直在做什么?或者 APOC 是否以某种方式在查询之上执行其他操作?APOC 程序对注射是否“安全”?