2016-03-15 74 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])” ));' –