2017-06-14 7 views
0

私は文字列nodeTypeをノードのラベルとしてneo4jに格納する必要があります。サイファーでは、これはnodeTypeは、この操作の前に設定した文字列であるneo4jclientでノードのラベルをプログラムでどのように設定しますか?

CREATE (n:nodeType) 

だろう。 neo4jclientで私は

.Create("(x:{type})") 
.WithParam("type", nodeType) 

を試してみましたが、これは明らかに、パラメータの正しい使用方法ではなく、同じエラーを与える別の集合演算にラベル付与の移動エラー

Unhandled Exception: Neo4jClient.NeoException: SyntaxError: 
Invalid input '{': expected whitespace or a label name 
"CREATE (x:{type})" 
     ^

を与えます。

.Create("(x)") 
.Set("x :{type}") 
.WithParam("type", nodeType) 

official neo4jclient documentation on parametersは「...あなたは流暢なクエリの任意の時点でパラメータを作成することができます」と述べているが、これはオープンブラケットが開始として扱われていないとして、場合ではないようですCypherエンジンによるパラメタ。私はここで間違って何をしていますか?

文字列の連結は非常に良いアイデアなので、neo4jclientの変数からノードのラベルを設定する方法は何でしょうか?

+0

んを使用することがはるかに容易になるだろうということが正しいです[this](https://github.com/Readify/Neo4jClient/wiki/cypher-examples#create-a-user)ヘルプ? – stuartd

+0

いいえ、それはノードプロパティをパラメータで設定する方法を説明しています。私はノードのラベルを設定する必要があります。この例では、変数を設定する必要があるのは「ユーザー」です。 – slbelden

答えて

1

サイファークエリでラベルをパラメータ化することはできません。

var nodeType = "MyNode"; 
client.Cypher.Create($"(x:{nodeType})").ExecuteWithoutResults(); 

をしたり、C#6使用できない場合:CALL apoc.create.node(['Label'], {key:value,…​})

1

は個人的に私はどうしたら:

client.Cypher.Create(string.Format("(x:{0})", nodeType).ExecuteWithoutResults() 
を は、この手順で APOCを使用することができ、ダイナミックラベルでノードを作成するには

これらのどちらも文字列連結を使用していないことに注意することが重要です。これはstring.Formatと文字列補間が助けとなるものです。

logisimaは、あなたがサイファー経由でそれを行うことはできませんし、あなたの唯一のオプションは、あなたがそのように何をする必要があります場合はAPOCにシフトするだろうが、文字列のオプションが

+0

技術的に連結されていないからといって、リスクがまったく緩和されるわけではありません。このコードでは、任意の文字列をCypherクエリに挿入することができます。これは、衛生的な攻撃(インジェクション攻撃の脆弱性)がなくても可能です。 – slbelden

+0

右 - あなたは注入リスクを指しているのですが、文字列連結問題ではありません。あなたは正しく、私はあなたがメモリ割り当ての問題を指していた連結を述べたと思った。しかし、私は、外部ユーザが 'Label'を渡すことを許可している場合にのみ問題であると主張します*その場合は意味があります。スキーマが設定されていて、ラベルがあなたの所有物である場合、リスクは外部ソースから取り込まないため、そこには存在しません。 –

+0

これは私たちが使い終わった解決策です。もともと私たちはこのアプリケーションでラベルを入力できるようにするつもりでしたが、注入リスクとAPOCの使用の複雑さのために、受け入れられたラベルのリストを 'enum'に入れて、それらから。 'enum'では文字列補間を少しでも気にすることができます。 – slbelden

関連する問題