2013-06-03 28 views
0

我想避免在查詢語句中使用注入parms。因此,我們使用來自Neo4j的.NET客戶端級以下說明:如何QUERY Neo4J使用.NET客戶端WithParms而不是注入?

 var queryClassRelationshipsNodes = client.Cypher 
         .Start("a", (NodeReference)sourceReference.Id) 
         .Match("a-[Rel: ***{relationshipType***} ]->foundClass") 
         .Where("Rel.RelationStartNode =" + "\'" + relationshipStart + "\'") 
         .AndWhere("Rel.RelationDomainNode =" + "\'" + relationshipDomain + "\'") 
         .AndWhere("Rel.RelationClassNode =" + "\'" + relationshipClass + "\'") 
         .WithParam("relationshipType", relationshipType) 
         .Return<Node<Dictionary<string, string>>>("foundClass") 
         .Results; 

但是這個代碼不工作,一旦服務器執行。出於某種原因,PARM:relationshipType與我們在{}之間放置的變量沒有關聯。

有人可以幫助我們調試這個代碼的問題嗎?我們寧願使用WithParms而不是在聲明中注入變量。

非常感謝!

回答

2

有人可以幫助我們調試這個代碼的問題嗎?

標題爲「調試」的https://bitbucket.org/Readify/neo4jclient/wiki/cypher有一節介紹瞭如何做到這一點。

至於你的核心問題,但你的方法是打一個Cypher限制。參數用於查詢中未編譯到查詢計劃中的部分。然而,匹配條款。

the Neo4j documentation

參數可在WHERE子句中用於文字和表情,爲START子句,索引的查詢中的索引關鍵字和索引值,最後節點/關係的ID。參數不能用於屬性名稱,因爲屬性表示法是編譯到查詢計劃中的查詢結構的一部分。

你可以這樣做:

.Match("a-[Rel:]->foundClass") 
.Where("type(Rel) = {relationshipType}") 
.WithParam("relationshipType", relationshipType) 

(聲明:我剛剛輸入的,在這裏我沒有測試它在所有。)

這很可能會比較慢,雖然,因爲你需要檢索所有關係,然後測試它們的類型。你應該測試這個。爲什麼match子句被編譯到查詢計劃中是有原因的。

+0

這是非常有幫助的。謝謝Tatham! – user2275688

+0

如果有幫助,您能否將其標記爲接受的答案? –

相關問題