2014-10-02 128 views
0

我想獲得有兩個賬戶的客戶,一個是Type1,另一個是Type2。 Cygher查詢如下Neo4j Cypher使用'WITH'查詢C#


MATCH (client:Client)-[:OWNED_BY]-(account:Account)-[:TYPE_IN]-(type:Type) 
With client, account, type 
MATCH (client)-[:OWNED_BY]-(account1:Account)-[:TYPE_IN]-(:Type{accountType: 'Type1'}) 
,(client)-[:OWNED_BY]-(account2:Account)-[:TYPE_IN]-(:Type{accountType: 'Type2'}) 
RETURN client, account, type 

它的工作原理(任何增強是值得歡迎的,但這不是我的問題)

我怎樣才能把它轉換成C#?特別是「與客戶,帳戶,類型」部分。我有Neo4j.client

我設法做到這一點,


StringBuilder queryString =new StringBuilder(); 
      StringBuilder addtionQuery = new StringBuilder(); 

      queryString.Append("(client:Client)-[:OWNED_BY]-(account:Account)-[:TYPE_IN]-(type:Type)"); 

      addtionQuery.Append(String.Format("(client)-[:OWNED_BY]-(account0:Account)-[:TYPE_IN]-(:Type{{accountType: '{0}'}})" 
       , searchCriteria.acctTypes[0])); 

      for (int i = 1; i < searchCriteria.acctTypes.Length; i++) 
      { 
       if (searchCriteria.acctTypes[i] != null) 
       { 
        addtionQuery.Append(","); 
        addtionQuery.Append(String.Format("(client)-[:OWNED_BY]-(account{1}:Account)-[:TYPE_IN]-(acct_type{1}:Type{{accountType: '{0}'}})", 
         searchCriteria.acctTypes[i], i)); 
       } 
      } 


var query = Dbclient.Cypher 
       .OptionalMatch(queryString.ToString()) 
       .With((client, account, type) => new 
       { 
        client = client.As<Client>(), 
        type = type.As<Demo1.Models.Type>(), 
        account = account.As<Account>() 
       }) 
       .OptionalMatch(addtionQuery.ToString()) 
       .Return((client, account, type) => new QueryResult 
       { 
        cif = client.As<Client>().cif, 
        type = type.As<Demo1.Models.Type>().accountType, 
        accountId = account.As<Account>().accountId 
       }) 
       .Limit(searchCriteria.limit) 
       .Results; 

它的工作原理,但結果是不正確

回答

0

那麼,你的查詢是不同的。你的Cypher查詢有MATCH條款,而你的Neo4jClient查詢有OPTIONAL MATCH條款,你必須爲你的節點不同的名稱(帳戶,帳戶1,帳戶2,... < - >賬戶,account0,...)。

我建議你確保兩個查詢都是一樣的。您可以使用調試器或將結果的Cypher查詢打印到query.Query.QueryTextquery.Query.DebugQueryText。在這種情況下,query就是你在調用.Results之前得到的,但是你的變量名稱有點偏離。

至於WITH而言,With()方法可以採取string作爲參數,所以你可以簡單的寫:

.With("client, account, type") 

海事組織,With(),需要一個拉姆達提供了很少或沒有收穫需要一個string,它只是更多的噪音。

+0

query.Query.QueryText或query.Query.DebugQueryText沒有幫助,我用匹配取代了第二個選項匹配,它現在可以工作。涼 – Leo 2014-10-03 00:54:55

0

我不能幫你用C#neo4jclient API ,但你的發言可能是更有效的是這樣的:

MATCH (client:Client)-[:OWNED_BY]-(account:Account)-[:TYPE_IN]-(type:Type) 
WHERE type.accountType IN ['Type1','Type2'] 
With client, collect([account, type]) as accounts 
WHERE size(accounts) > 1 
RETURN client, accounts 
+0

感謝隊友,你的查詢更有效,但有一個問題是,它可能會返回客戶端有兩個帳戶,這都是TYPE1/TYPE2。我需要客戶有2個不同類型的帳戶。 – Leo 2014-10-03 00:00:32