如何在.net neo4j客户端中将关系属性作为参数传递?

时间:2013-03-26 12:19:26

标签: neo4j neo4jclient

我想将参数传递给查询,以便我可以在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");

1 个答案:

答案 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);

我在答案框中写了这段代码,并没有测试过,而且它很可怕,而且很难看,我有点像你不使用它。