【问题标题】:Casting nodes of an unknown type铸造未知类型的节点
【发布时间】:2014-02-18 16:44:21
【问题描述】:

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

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

关于如何开始使用这个有什么想法吗?

【问题讨论】:

  • 如果你能提供更多关于你正在尝试做的事情的细节,这将更容易帮助。

标签: c# neo4j neo4jclient


【解决方案1】:

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

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&lt;string&gt; - 通常对此不满意 - 我使用它的原因是它去除了 neo4j 返回的所有正常内容,并且将Data 分开 - 这真的是我感兴趣的全部。

您可能很想尝试这样做:

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

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

这至少应该为您提供一个起点,如果您在特定类型的查询方面需要帮助,则值得将查询放在此处以供参考。

【讨论】:

  • 感谢 Chris,这帮助我弄清楚了如何使用模板/泛型从 Neo4j 动态返回任何类型的类!我不得不对其进行大量修改并将其分解为多个模板函数,但我终于让它工作了。太棒了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多