我将一些数据建模为一组简单的嵌套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节点相关联的方法。
我是否以正确的方式处理了这件事?
感谢任何回复,提前感谢...
嗯,在一个查询中完成是可能的——不幸的是,我不认为你可以使用美味的UNWIND
或FOREACH
,因为有辅助嵌套,你需要对类做一些时髦的事情,但是,这里有:
首先,我们需要定义类,这样我们就可以反序列化属性,而不是序列化它们
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结构可以使用以下代码创建-