2017-06-14 44 views
0

我有一個字符串nodeType需要存儲在neo4j作爲節點的標籤。在Cypher中,這將是如何以編程方式在neo4jclient中設置節點的標籤?

CREATE (n:nodeType) 

其中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

不[這](https://github.com/Readify/Neo4jClient/wiki/cypher-examples#create-a-user)幫助? – stuartd

+0

不,這是解釋如何使用參數設置節點屬性。我需要設置一個節點的標籤。在那個例子中,我需要用一個變量來設置「User」。 – slbelden

回答

1

標籤無法在密碼查詢中參數化。 要創建一個節點有一個動態的標籤,你可以使用APOC此程序:CALL apoc.create.node(['Label'], {key:value,…​})

1

個人而言,我會做:

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

,或者如果您不能使用C#6:

client.Cypher.Create(string.Format("(x:{0})", nodeType).ExecuteWithoutResults() 

我認爲這裏很重要的一點是它們都不使用字符串連接。這是string.Format和字符串插值被設計來幫助。

logisima是正確的,你無法通過暗號做到這一點,你唯一的選擇是轉移到APOC,如果你需要做這樣的說法,但字符串選項更容易使用

+0

僅僅因爲它不是技術上的串聯並不意味着風險就會減輕。此代碼仍允許將任意字符串插入到Cypher查詢中,而無需任何衛生設備,這是一個注入攻擊漏洞。 – slbelden

+0

正確 - 所以你指的是注入風險,而不是字符串連接問題。你說的很對,我認爲你提到的串聯是指內存分配問題。然而 - 我認爲這只是一個問題*如果您允許外部用戶在這種情況下傳遞「標籤」 - 這是有道理的。如果您的架構已設置且標籤屬於您,那麼風險就不存在了,因爲您不會從外部來源獲取該標籤。 –

+0

這是我們最終使用的解決方案。最初我們準備讓最終用戶在這個應用程序中輸入一個標籤,但由於注入風險和使用APOC的複雜性,我們決定將一個可接受的標籤列表放在'enum'中,並讓用戶選擇從那些。有了'enum',我們可以使用字符串插值而不用擔心。 – slbelden

相關問題