在Neo4J Client for C中展开并合并带有动态标签的结果#
我目前正在尝试使用Neo4J客户机解开要合并到数据库的对象列表。我想做的是展开列表并创建带有标签的节点,该标签是根据项目本身的属性生成的,而不是硬编码标签名称。根据我所能找到的,我必须使用merge方法来这样做。但是,我无法将其转换为Neo4J客户端。在neo4J解释中,它们在apoc.merge.node调用之后生成一个节点,然后返回该节点。但是,我不能简单地返回节点,也不能设置节点(我已经到了无所事事的地步,有一次我让标签工作,但它用列表中的最后一项重写了所有属性) 我似乎错过了一些基本的东西,但我不太确定是什么。这里有没有人知道如何使用neo4J客户机实现这一点(如果可能,请解释一下发生了什么)?我对发展领域非常陌生,我觉得在这方面我缺少了一个关键的理解 我尝试的代码将所有属性转换为最后一个节点的属性,但至少按照我的预期创建了标签:在Neo4J Client for C中展开并合并带有动态标签的结果#,neo4j,cypher,neo4jclient,Neo4j,Cypher,Neo4jclient,我目前正在尝试使用Neo4J客户机解开要合并到数据库的对象列表。我想做的是展开列表并创建带有标签的节点,该标签是根据项目本身的属性生成的,而不是硬编码标签名称。根据我所能找到的,我必须使用merge方法来这样做。但是,我无法将其转换为Neo4J客户端。在neo4J解释中,它们在apoc.merge.node调用之后生成一个节点,然后返回该节点。但是,我不能简单地返回节点,也不能设置节点(我已经到了无所事事的地步,有一次我让标签工作,但它用列表中的最后一项重写了所有属性) 我似乎错过了一些基本的东
public async void CreateBatchItems(List<TToDataBase> itemList)
{
await Client.Cypher
.Unwind(itemList, "row")
.Merge("(n)")
.With("row, n")
.Call("apoc.merge.node([n.Name], n)").Yield("node")
.Set("n += node")
.ExecuteWithoutResultsAsync();
}
我还尝试了一个轻微的变化,这个类也有附加属性
[JsonProperty(PropertyName = "PropertyMap")]
public IProperty PropertyMap { get; set; }
其中PropertyMap是另一个包含名称和objectId的基本对象。无论如何,这对于将来的校对来说似乎是个好主意,因此可以轻松地扩展propertylist,而无需更改基本对象。[EDITED]
主要问题是Merge((n)”)
匹配任何已经存在的任意节点
您尚未显示itemList
中每个元素的数据结构,因此此答案将假定如下所示:
{Name: 'SomeLabel', id: 123, Props: {foo: 'xyz', bar: true}}
对于上述数据结构,这应该是可行的:
public async void CreateBatchItems(List<TToDataBase> itemList)
{
await Client.Cypher
.Unwind(itemList, "row")
.Call("apoc.merge.node([row.ObjectId], row.id)").Yield("node")
.Set("node += row.Props")
.ExecuteWithoutResultsAsync();
}
此代码将节点标签Foo
分配给所有生成的节点。一个节点应该总是有一个标签,这可以提高清晰度,也有助于提高效率——特别是如果您还创建了一个标签的话。例如,:Foo(id)
上的索引将使上述查询更加高效
此代码还假设
id
属性应该包含唯一的Foo
节点标识符。谢谢您的回复!不幸的是,这对我不起作用。。我添加了一个编辑,其中解释了我在列表中使用的对象。我收到“无法强制字符串(“1”)
映射”消息。我不确定它期望什么,因为Chris Skardon的回答让我认为类可以理解为地图:我还想知道你答案中的row.Props.id部分。从您的示例中,id似乎存在于props之外,但据我所知,它被称为props属性的一部分?我更正了我的原始答案,使用了行.id
,但鉴于您的实际数据结构,我的原始答案没有帮助。我添加了一个更新
,并提供了一个更有用的答案。感谢您的更新。问题是我从外部来源获取数据,所以我事先不知道标签。在我的源代码中,数据是按标签分组的,但我不能硬编码标签,因为它们不是静态的。现在我使用的是自构建队列和单节点和边缘创建方法,但这是一个有点噱头的解决方案,并没有我预期的那么有效。我正在考虑的另一件事是为第一次加载创建非常广泛的预定义标签,然后在文件上标记更具体的动态标签。
public async void CreateBatchItems(List<TToDataBase> itemList)
{
await Client.Cypher
.Unwind(itemList, "row")
.Call("apoc.merge.node([row.ObjectId], row.id)").Yield("node")
.Set("node += row.Props")
.ExecuteWithoutResultsAsync();
}
public async void CreateBatchItems(List<TToDataBase> itemList)
{
await Client.Cypher
.Unwind(itemList, "row")
.Merge("(n:Foo {id: row.ObjectId})")
.Set("n += row.Name")
.ExecuteWithoutResultsAsync();
}