铸造未知类型的节点

在使用Neo4j时,我能够创建带有标签的节点数组,然后在这些节点之间创建关系。 标签基本上是我的POCO的映射(Dog标签与C#中的Dog POCO有关),这些POCO是从一个只包含ID属性的简单基础POCO实现的。

当我知道要检索的节点的类型/标签时,我能够使用node.As 语法在return语句中转换它。 但是,当执行诸如遍历节点之间的路径之类的操作时,我将不知道我正在遍历的节点的类型。 虽然技术上可以将节点作为我的POCO实现的基类型进行转换,但是我会丢失特定于超类的所有属性。

关于如何开始使用这个的任何想法?

图形

您可以(取决于您对它的感觉)尝试使用动态,例如,您可以这样设置:

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>(), Dog = d.As>()}); var results = query.Results.ToList(); foreach (var result in results) { dynamic p = JsonConvert.DeserializeObject(result.Person.Data); dynamic d = JsonConvert.DeserializeObject(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 – 这通常是不受欢迎的 – 我使用它的原因是它删除了neo4j返回的所有正常内容,并将Data分离出去 -真的是我感兴趣的全部。

你可能想尝试做:

 .Return((p,d) => new {Person = p.As(), Dog = d.As()}); 

但是你最终会遇到的问题是Neo4jClient不会处理动态,并且实际上会将其作为丢失所有属性的object返回。

这至少应该为您提供一个起点,如果您需要有关特定类型查询的帮助,那么值得提出查询以供参考。