在Neo4jClient Cypher Query中返回多个列

时间:2013-05-08 02:29:43

标签: neo4jclient

我正在使用Azure并且发现性能很慢。为了减少往返时间,我将以下查询添加到一个查询中。

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语句

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

然后我遇到以下陈述的问题

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

它表示错误无法将类型'AnonymousType#1'隐式转换为'Neo4jClient.Node。

您能否建议一个简单的语法或返回多列以及提取第一个节点的方法? TIA。

1 个答案:

答案 0 :(得分: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:我希望你实际上并不是夜总会。小海豹不喜欢那样。您正在合并查询。