1

CreateUniqueでリレーションシッププロパティを使用できるように、パラメータをクエリに渡したいのですが。文字列形式を使用するのではなく、パラメーターを使用して、サイファーインジェクションから保護できるようにします(パラメーターがサイファーインジェクションで保護されていると仮定しますか?)。

   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");
4

1 に答える 1

2

更新:最終的には単純な追加だったので、先に進んで追加しました。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");

あなたは今これを良い方法で行うことはできません。

はい、サイファーパラメータはすべてインジェクションから安全です。それらをクエリテキストから分離するために、まったく異なる構成でネットワークを介して渡します。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);

私はそのコードをここの回答ボックスに書きましたが、テストしていません。それは恐ろしくて醜いので、使用しないでください。

于 2013-03-26T15:49:18.060 に答える