繁体   English   中英

投射未知类型的节点

[英]Casting nodes of an unknown type

在使用Neo4j时,我可以创建带有标签的节点数组,然后在这些节点之间创建关系。 标签本质上是到我的POCO的映射(Dog标签与C#中的Dog POCO相关),并且这些POCO从仅包含ID属性的简单基本POCO实现。

当我知道要检索的节点的类型/标签时,就可以使用node.As <T>语法在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<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返回。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM