我想将参数传递给查询,以便我可以在CreateUnique中使用关系属性。我更喜欢使用参数,而不仅仅是使用字符串格式,以便它可以保护(我在aassuming参数中的权利是密码注入保护?),以防止密码注入。
var query = client.Cypher.Start(
new CypherStartBitWithNodeIndexLookup("left", AUTOINDEX, PrimaryIndexKey, uname),
new CypherStartBitWithNodeIndexLookupWithSingleParameter("right", AUTOINDEX, luceneQuery)
).CreateUnique("left-[r:Installed {DeviceId:{DeviceId},OS:{OS}}]->right").Return<Software>("right");
答案 0 :(得分:1)
更新:最后这是一个简单的添加,所以我继续添加它。自1.0.0.517起,与下面相关的提案现已在NuGet上实施并可用。
您的查询可以是:
var query = client
.Cypher
.Start(
new CypherStartBitWithNodeIndexLookup("left", AUTOINDEX, PrimaryIndexKey, uname),
new CypherStartBitWithNodeIndexLookupWithSingleParameter("right", AUTOINDEX, luceneQuery)
)
.CreateUnique("left-[r:Installed {DeviceId:{DeviceId},OS:{OS}}]->right")
.WithParam("DeviceId", 123)
.WithParam("OS", "Windows 8")
.Return<Software>("right");
你现在不能以一种很好的方式做到这一点。
是的,Cypher参数都可以安全注射。我们通过一个完全不同的结构传递它们,使它们与查询文本分开。在Neo4j中,它们的存储独立于查询的执行计划。
我在https://bitbucket.org/Readify/neo4jclient/issue/66/support-custom-parameters-in-cypher-fluent打开了一个问题,提出了一个语法,以便我们可以实现它。如果您查看提案并在那里进行协作,我们可以很快得到这个。
作为一种解决方法,您可以执行:
var query = client
.Cypher
.Start(
new CypherStartBitWithNodeIndexLookup("left", AUTOINDEX, PrimaryIndexKey, uname),
new CypherStartBitWithNodeIndexLookupWithSingleParameter("right", AUTOINDEX, luceneQuery)
)
.CreateUnique("left-[r:Installed {DeviceId:{DeviceId},OS:{OS}}]->right")
.Return<Software>("right")
.Query;
query.QueryParameters.Add("DeviceId", 123);
query.QueryParameters.Add("OS", "Windows 8");
var results = client.ExecuteGetCypherResults<Software>(query);
我在答案框中写了这段代码,并没有测试过,而且它很可怕,而且很难看,我有点像你不使用它。