当前位置: 首页 > 知识库问答 >
问题:

使用Neo4jClient和Cypher从嵌套对象创建图形

闾丘晨
2023-03-14

我将一些数据建模为一组简单的嵌套c#对象,我正试图使用。Net Neo4jClient。

我的课程形式如下:

public class Foo {
    public int ID { get; set; }
    public List<Bar> bar { get; set;}
}

public class Bar {
    public int ID { get; set; }
    public List<Baz> baz { get; set;}
}

public class Baz {
    public int ID { get; set; }
}

一旦数据以正确的形式存储在数据库中:

(f:Foo)-[h:HASBAR]->(b:Bar)-[hb:HASBAZ]->(bz:Baz) 

我可以使用collect和optional match,通过以下查询将数据检索到我的类结构中:

List<Foo> foolist = WebApiConfig.GraphClient.Cypher
    .Match("(f:Foo)-[h:HASBAR]->(b:Bar)")
    .OptionalMatch("(b)-[hb:HASBAZ]->(bz:Baz)")
    .With("f, { ID: b.ID, baz: collect(bz) } as Bar")
    .With("{ ID:f.ID, bar:collect(Bar) } as Foo")
    .Return<Foo>("Foo")
    .Results
    .ToList();

这一切都非常有效,数据被正确地序列化到适当的类中。

我的问题是我应该如何执行相反的操作?

在给定的一个Foo类中,包含多个嵌套的bar和baz类,我可以在一个查询中在数据库中创建上述数据结构吗?

或者我必须为每个嵌套级别编写一个查询?

我知道在创建时可能必须列出属性,就像我给客户机一个Foo类,它将创建一个以“bar”作为属性的节点一样。

我的问题主要来自第三层嵌套,如果我将第二层(bar)视为数组(传入Foo.bar)作为变量,我可以创建多个[: HASBAR]关系。但是在同一个查询中,我没有找到将正确的Baz节点与Bar节点相关联的方法。

我是否以正确的方式处理了这件事?

感谢任何回复,提前感谢...

共有1个答案

孟璞
2023-03-14

嗯,在一个查询中完成是可能的——不幸的是,我不认为你可以使用美味的UNWINDFOREACH,因为有辅助嵌套,你需要对类做一些时髦的事情,但是,这里有:

首先,我们需要定义类,这样我们就可以反序列化属性,而不是序列化它们

public class Foo
{
    public int ID { get; set; }

    [JsonIgnore]
    public List<Bar> bar { get; set; }

    [JsonProperty("bar")]
    private List<Bar> barSetter { set { bar = value;} }
}

public class Bar
{
    public int ID { get; set; }

    [JsonIgnore]
    public List<Baz> baz { get; set; }

    [JsonProperty("baz")]
    private List<Baz> bazSetter { set { baz = value; } }
}

public class Baz
{
    public int ID { get; set; }
}

这是什么疯狂??!?!好吧——通过使用[JsonIgnore],我们告诉Json不要序列化或反序列化给定的属性——但是我们想反序列化,这样你的检索查询就可以工作——所以使用JsonProperties私有设置器可以让我们实现这一点。

这种方法的额外好处是,您不需要在Cypher生成位中指定要序列化的属性。这是它的荣耀:

var query = gc.Cypher
    .Create("(f:Foo {fooParam})")
    .WithParam("fooParam", foo);

for (int barIndex = 0; barIndex < foo.bar.Count; barIndex++)
{
    var barIdentifier = $"bar{barIndex}";
    var barParam = $"{barIdentifier}Param";
    query = query
        .With("f")
        .Create($"(f)-[:HASBAR]->({barIdentifier}:Bar {{{barParam}}})")
        .WithParam(barParam, foo.bar[barIndex]);

    for (int bazIndex = 0; bazIndex < foo.bar[barIndex].baz.Count; bazIndex++)
    {
        var bazIdentifier = $"baz{barIndex}{bazIndex}";
        var bazParam = $"{bazIdentifier}Param";
        query = query
            .With($"f, {barIdentifier}")
            .Create($"({barIdentifier})-[:HASBAZ]->({bazIdentifier}:Baz {{{bazParam}}})")
            .WithParam(bazParam, foo.bar[barIndex].baz[bazIndex]);
    }
}

f: Foo位是正常的,随后的for循环允许您定义每个标识符并设置参数。

我不认为这是一个理想的解决方案,但它会工作,并将在1个查询中执行。Obvs,如果有很多嵌套的值,这可能会变得很笨拙。

 类似资料:
  • 问题内容: 如何将JSON传递到RAILS应用程序,以便它将以has_many关系创建嵌套的子对象? 这是我到目前为止的内容: 两个模型对象。 使用通勤,我可以设置标准控制器。我希望能够使用JSON在一个REST调用中创建一个Commute对象以及几个子Location对象。我一直在尝试这样的事情: 更具可读性的JSON是: 执行该命令时,将得到以下输出: 看起来好像正在读取JSON数组的loca

  • 我正在使用MongoDB-Hadoop连接器读取具有嵌入文档的集合。 例外 scala.matcherror:io.abc.spark.schema.personametadata@31FF5060(类为io.abc.spark.sql.catalyst.catalyst.catalysttypeConverters$structconverters.scala:255)在org.apache.s

  • 问题内容: 我正在尝试从JSON创建嵌套的UL。我能够遍历并从对象中获取数据,但是在构建嵌套UL时遇到了麻烦。我认为’.append’方法放置在错误的位置。生成的LI都分组在一起。我如何创建一个循环(或者也可以用另一种方法)来构建带有正确嵌套的子菜单LI的UL?我曾尝试使用其他类似的帖子来解决我的问题,但是我的数据和代码似乎没有任何意义。对此有些不解之举- 我尝试了几种方法来创建此动态列表,但到目

  • 类MedicalJournalEntry: 类别血压: 我使用片段创建了一个表单。它对“普通”字段非常有效,但是自从我添加了嵌套对象字段后,Thymeleaf甚至不能再创建保存表单的视图了。当我想要显示窗体时,我总是得到以下错误: 以及引发问题的片段对应内容: 这是我的控制器。它只返回包含新MedicalJournalEntry的输入数据表单的视图:

  • 问题内容: 我不太使用php,并且在对象创建方面有些模糊。我需要发出一个发送json的网络服务请求,我想我已经覆盖了那部分。在提交数据之前,我需要创建一个嵌套对象。根据我对基于ecma的脚本语言的经验,我认为这是微不足道的,但是我发现该语法难以导航。我要创建的对象如下。 我已经看到了许多平面对象的示例,但是还没有找到嵌套对象的最小示例。上面对象的php语法是什么?这是在PHP中做的不寻常的事情吗?

  • 本文向大家介绍PHP 中如何创建嵌套 JSON 对象,包括了PHP 中如何创建嵌套 JSON 对象的使用技巧和注意事项,需要的朋友参考一下 JSON结构可以使用以下代码创建-