您可以(取决于您的感受)尝试使用动态,例如,您可以这样设置:
var dog = new Dog {Name = "Woofer", Breed = "Afghan Hound"};
var owner = new Person {Name = "Jeff", PhoneNumber = "01234567890"};
//CREATE
gc.Cypher.
Create("(owner:Person {ownerParams})")
.WithParam("ownerParams", owner)
.With("owner")
.Create("(owner)-[:HAS_PET]->(dog:Dog {dogParams})")
.WithParam("dogParams", dog)
.ExecuteWithoutResults();
并通过以下方式检索:
//RETURN
var query = gc.Cypher
.Match("(p:Person)-[:HAS_PET]->(d:Dog)")
.Return((p, d) => new {Person = p.As<Node<string>>(), Dog = d.As<Node<string>>()});
var results = query.Results.ToList();
foreach (var result in results)
{
dynamic p = JsonConvert.DeserializeObject<dynamic>(result.Person.Data);
dynamic d = JsonConvert.DeserializeObject<dynamic>(result.Dog.Data);
Console.WriteLine("If you find {0} (a {1}) please call {2} on {3}.", d.Name, d.Breed, p.Name, p.PhoneNumber);
}
显然在这种情况下,我会知道我返回的类型。现在,您会注意到我在其中使用了 Node<string> - 通常对此不满意 - 我使用它的原因是它去除了 neo4j 返回的所有正常内容,并且将Data 分开 - 这真的是我感兴趣的全部。
您可能很想尝试这样做:
.Return((p,d) => new {Person = p.As<dynamic>(), Dog = d.As<dynamic>()});
但您最终会遇到的问题是 Neo4jClient 不处理动态,实际上会将其作为 object 返回,这会丢失您的所有属性。
这至少应该为您提供一个起点,如果您在特定类型的查询方面需要帮助,则值得将查询放在此处以供参考。