2016-09-15 37 views
0

我想在neo4jclient中寫入一個查詢,以在1次命中中將層次樹的所有部分添加到數據庫中。 雖然我在集合上使用合併時遇到了麻煩。 我看到了foreach函數,但沒有成功讓它工作。Neo4jClient對於每個合併

到目前爲止我試過下面的 我試過把它寫成一個完整的字符串,但不斷收到'Neo4jClient.NeoException:SyntaxException:無效輸入'的異常。':期望一個標識符字符,空格,' }'或':'(第6行,第90列(偏移:266))'

字符串下方是我如何使用foreach函數像c#一樣工作但不知道正確的語法。

任何幫助將非常感激。

public void Save(CypherAspirationsViewModel aspirations, string emailAddress) 
    { 
     var query = graphClient.Cypher 
      .Match("(user:User)") 
      .Where((CypherUser user) => user.EmailAddress == emailAddress) 

      // Aspirations 
      .Merge("user" + CypherRelationships.Aspirations + ">(aspirations:Aspirations {Guid: {aspirationsGuid}})") 
      .OnCreate() 
      .Set("aspirations = {aspirations}") 
      .WithParams(new 
      { 
       aspirationsGuid = aspirations.CypherAspirations.Guid, 
       aspirations = aspirations.CypherAspirations 
      }); 


     // Permanent Remuneration 
     if (aspirations.CypherPermanentRemuneration != null) { 
      query = query.Merge("aspirations" + CypherRelationships.PermanentRemuneration + ">(permanentRemuneration:Remuneration {Guid: {permanentRemunerationGuid}})") 
       .OnCreate() 
       .Set("permanentRemuneration = {permanentRemuneration}") 
       .WithParams(new 
       { 
        permanentRemunerationGuid = aspirations.CypherPermanentRemuneration.Guid, 
        permanentRemuneration = aspirations.CypherPermanentRemuneration 
       }); 
      } 

     // Contract Remuneration 
     if (aspirations.CypherContractRemuneration != null) { 
      query = query.Merge("aspirations" + CypherRelationships.ContractRemuneration + ">(contractRemuneration:Remuneration {Guid: {contractRemunerationGuid}})") 
       .OnCreate() 
       .Set("contractRemuneration = {contractRemuneration}") 
       .WithParams(new 
       { 
        contractRemunerationGuid = aspirations.CypherContractRemuneration.Guid, 
        contractRemuneration = aspirations.CypherContractRemuneration 
       }); 
      } 

     // Consultant Remuneration 
     if(aspirations.CypherConsultantRemuneration != null) 
     { 
      query = query.Merge("aspirations" + CypherRelationships.ConsultantRemuneration + ">(consultantRemuneration:Remuneration {Guid: {consultantRemunerationGuid}})") 
       .OnCreate() 
       .Set("consultantRemuneration = {consultantRemuneration}") 
       .WithParams(new 
       { 
        consultantRemunerationGuid = aspirations.CypherConsultantRemuneration.Guid, 
        consultantRemuneration = aspirations.CypherConsultantRemuneration 
       }); 
     } 

     // Locations 
     if (aspirations.CypherLocations != null) 
     { 
      //string forEachString = "(n in {locations} | merge (aspirations " + CypherRelationships.Location + ">(location:Location {Guid: {n.Guid}})) on create set location.Name = n.Name, location.Longitude = n.Longitude, location.Latitude = n.Latitude)"; 
      //query = query 
      // .ForEach(forEachString) 
      // .WithParam("locations", aspirations.CypherLocations); 

      query = query.ForEach("CypherLocation location in aspirations.CypherLocations") 
       .Merge("aspirations" + CypherRelationships.Location + ">(location:Location {Guid: {locationGuid}})") 
       .OnCreate() 
       .Set("location = {location}") 
       .WithParams(new 
       { 
        locationGuid = location.Guid, 
        location = location 
       }); 
     } 

     query.ExecuteWithoutResults(); 
    } 

的Cypher查詢:

MATCH (user:User) 
WHERE (user.EmailAddress = "email") 
MERGE user-[:ASPIRATIONS]->(aspirations:Aspirations {Guid: "0d700793-4702-41ee-99f1-685472e65e51"}) 
ON CREATE 
SET aspirations = { 
    "FullTime": true, 
    "PartTime": false, 
    "Permanent": false, 
    "Contract": false, 
    "Consultant": false, 
    "WillingToRelocate": false, 
    "CommuteEnum": 40, 
    "Guid": "0d700793-4702-41ee-99f1-685472e65e51" 
} 


FOREACH (n in [ 
    { 
    "Name": "Location1", 
    "Longitude": 10.0, 
    "Latitude": 1.0, 
    "Guid": "a9f25fda-9559-4723-80ec-d8711a260adc" 
    } 
] | 
merge (aspirations -[:LOCATION]->(location:Location {Guid: {n.Guid}})) 
on create set location.Name = n.Name, location.Longitude = n.Longitude, location.Latitude = n.Latitude) 
+0

嗨Gavin,如果你在你的'query.ExecuteWithoutResults'行放置一個斷點,你能得到'query.Query.DebugQueryText'的值,因爲這將有助於找出問題所在! –

+0

感謝Chris,我添加了debugquerytext。 –

+0

對不起延遲 - 呃,如果你執行Cypher進入管理窗口(http:// localhost:7474 /),你是否會得到同樣的錯誤(你需要找到/替換'\「'和'\ r \ n'去讓它工作) –

回答

0

好吧,我想我已經得到了它釘。有需要一些暗號變化(取決於服務器版本)

首先,原來的錯誤是從ForEach最終Merge - 你有{Guid: {n.Guid}}但你並不需要額外的{} - 所以它應該是: {Guid: n.Guid}

一旦你得到了,如果你要對一個3.0數據庫,你需要添加一些括號中的合併方法,例如:

.Merge("user" + CypherRelationships.Aspirations + ">(aspirations:Aspirations {Guid: {aspirationsGuid}})") 

應該變成:

.Merge("user" + CypherRelationships.AspirationsWithClosingParentheses + ">(aspirations:Aspirations {Guid: {aspirationsGuid}})") 

其中AspirationsWithClosingParentheses是一樣的東西:

var AspirationsWithClosingParentheses = "Aspirations)--" 

你需要做的是爲合併,因爲3.0需要標識符被包圍!