2013-05-08 64 views
2

我正在使用Azure並發現性能較慢。爲了減少往返時間,我將以下查詢分爲一個查詢。在Neo4jClient中返回多個列Cypher查詢

var queryItem = _graphClient 
      .Cypher 
      .Start(new 
      { 
       n = Node.ByIndexLookup("item_idx", "SKU", sSKU1), 
      }) 
      .Return<Node<Item>>("n"); 

某處代碼一樣,我有如下語句

var queryItem = _graphClient 
      .Cypher 
      .Start(new 
      { 
       m = Node.ByIndexLookup("item_idx", "SKU", sSKU2), 
      }) 
      .Return<Node<Item>>("m"); 

我嘗試上述兩種查詢組合成一個單一的查詢像這樣

var queryItem = _graphClient 
      .Cypher 
      .Start(new 
      { 
       n = Node.ByIndexLookup("item_idx", "SKU", sSKU1), 
       m = Node.ByIndexLookup("item_idx", "SKU", sSKU2), 
      }) 
      .Return<Node<Item>>("n"); 

我上面所知道的是僅適用於單列,所以我嘗試使用以下返回語句

.Return((n, m) => new 
     { 
      N = n.CollectAs<Node<Item>>(), 
      M = m.CollectAs<Node<Item>>() 
     }); 

但後來我有下面的語句

Node<Item> item1 = itemQueryResult.First(); 

問題,它說錯誤無法隱式轉換類型「AnonymousType#1」到「Neo4jClient.Node。

你可以請建議一個簡單的語法或返回多個列和一種方式來提取第一個節點? TIA。

回答

5

我想你在這裏丟失的是Return聲明返回一個對象每Cypher行

您的查詢返回一個表是這樣的:

|-----------------| 
| n | m | 
|-----------------| 
| Node | Node | 
|------------------ 

這是一個表,其中一行,兩列。

在這份聲明中,你是返回一個匿名類型每Cypher支架行

.Return((n, m) => new 
{ 
    N = n.CollectAs<Node<Item>>(), 
    M = m.CollectAs<Node<Item>>() 
}); 

該方法的返回類型爲IEnumerable<AnonymousType>

然後,您正在嘗試獲取第一個(匿名類型)並將其隱式轉換爲Node<Item>,這是無效的。

您應該得到該行,然後獲取其中的屬性。

其他需要注意以下幾點:

  • 你不想在這種情況下使用CollectAs:將打開你的表的每個細胞到一個數組相同的值,這只是增加了更多的間接。
  • .As<Node<T>>()可以寫爲.Node<T>()

考慮到這一點,這裏有你想要的查詢:

var result = _graphClient 
    .Cypher 
    .Start(new 
    { 
     n = Node.ByIndexLookup("item_idx", "SKU", sSKU1), 
     m = Node.ByIndexLookup("item_idx", "SKU", sSKU2), 
    }) 
    .Return((n, m) => new 
    { 
     N = n.Node<Item>(), 
     M = m.Node<Item>() 
    }) 
    .Results 
    .Single(); 

var n = result.N; 
var m = result.M; 

有意義嗎?

PS:我希望你其實沒有泡吧什麼。小海豹不喜歡那樣。你是結合查詢。

+0

lol @泡吧評論。 – Anshul 2013-05-08 19:49:56

+0

再次感謝您的詳細解釋。這說得通。儘管我遇到兩個問題。首先,如果n或m與索引不匹配,則查詢返回零結果。我想我會得到N或M爲空,所以至少我可以得到一個值。我發現的另一個問題是,如果indexlookup失敗,單引發異常。我解決了使用.ToList()。所以結合:)類型的作品,但需要獲得所有結果。 – Anshul 2013-05-08 19:55:27

+0

如果您有0或2或3或其他任何數量的結果,則單個設計將會拋出異常,但不會失敗。 – 2013-05-09 00:08:16