在使用Neo4j时,我能够创建带有标签的节点数组,然后在这些节点之间创建关系。标签基本上是我的POCO的映射(Dog标签与C#中的Dog POCO有关),这些POCO是从一个只包含ID属性的简单基础POCO实现的。
当我知道要检索的节点的类型/标签时,我可以使用该节点来转换它.As< T> return语句中的语法。但是,当执行诸如遍历节点之间的路径之类的操作时,我将不知道我正在遍历的节点的类型。虽然在技术上可以将节点转换为我的POCO实现的基本类型,但是我会丢失特定于超类的所有属性。
关于如何开始使用这个的任何想法?
答案 0 :(得分:6)
你可以(取决于你对它的感觉)尝试使用动态,例如,你可以这样设置:
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
返回,这会丢失所有属性。
这至少应该为您提供一个起点,如果您需要有关特定类型查询的帮助,则值得提出查询以供参考。