2016-03-15 68 views
1

我看了關於這一主題的許多問題,並創建以下幾乎動態查詢:使用Neo4j的客戶建立一個動態查詢

var resQuery = WebApiConfig.GraphClient.Cypher 
       .Match("(movie:Movie {title:{title}})") 
       .WithParam("title", title) 
       .Return(() => new { 
        movie = Return.As<string>("movie.title") 
       }).Results; 

不幸的是,這不是動態的,因爲我聲明瞭在返回匿名電影財產類型。

在所有的例子,我發現的唯一的選擇是作爲一個對象相匹配的節點屬性, 退回的節點:movie = Return.As<string>("movie.title")

我希望return語句給我回的鍵值對列表所有的節點屬性(它可以像JSON等任何表示形式),因爲 我的節點是通用的,而不是每次都從一個特定的對象類型。

是可能的嗎?

回答

2

你可以做這樣的事情:

var resQuery = WebApiConfig.GraphClient.Cypher 
    .Match("(movie:Movie {title:{title}})") 
    .WithParam("title", title) 
    .Return(() => Return.As<Node<Dictionary<string,string>>>("movie")); 

var results = resQuery.Results.Select(r => r.Data); 
Console.WriteLine(results.First()["title"]); 

另外,像:

var resQuery = WebApiConfig.GraphClient.Cypher 
    .Match("(movie:Movie {title:{title}})") 
    .WithParam("title", title) 
    .Return(() => Return.As<Node<string>>("movie")); 

var results = resQuery.Results; 
List<dynamic> nodes = results.Select(r => JsonConvert.DeserializeObject<dynamic>(r.Data)).ToList(); 
Console.WriteLine(nodes[0].title); 
+0

謝謝! 如果我想添加更多的返回值,該怎麼辦? 例如 'cast = Return.As >(「collect([person.name,head(split(lower(type(r)),'_')),r.roles])」) –

+0

@DorCohen do你的意思是在'.Return((x,y,z)=> new {X = x.As <>(),Y ='etc? –

+0

但是這會破壞動態,是否有可能返回多個節點?例如:'.Return(()=> Return.As (「movie,collect([person.name,head(split(lower(type(r)),'_')),r.roles])」 ));' –