在Neo4J Client for C中展开并合并带有动态标签的结果#

在Neo4J Client for C中展开并合并带有动态标签的结果#,neo4j,cypher,neo4jclient,Neo4j,Cypher,Neo4jclient,我目前正在尝试使用Neo4J客户机解开要合并到数据库的对象列表。我想做的是展开列表并创建带有标签的节点,该标签是根据项目本身的属性生成的,而不是硬编码标签名称。根据我所能找到的,我必须使用merge方法来这样做。但是,我无法将其转换为Neo4J客户端。在neo4J解释中,它们在apoc.merge.node调用之后生成一个节点,然后返回该节点。但是,我不能简单地返回节点,也不能设置节点(我已经到了无所事事的地步,有一次我让标签工作,但它用列表中的最后一项重写了所有属性) 我似乎错过了一些基本的东

我目前正在尝试使用Neo4J客户机解开要合并到数据库的对象列表。我想做的是展开列表并创建带有标签的节点,该标签是根据项目本身的属性生成的,而不是硬编码标签名称。根据我所能找到的,我必须使用merge方法来这样做。但是,我无法将其转换为Neo4J客户端。在neo4J解释中,它们在apoc.merge.node调用之后生成一个节点,然后返回该节点。但是,我不能简单地返回节点,也不能设置节点(我已经到了无所事事的地步,有一次我让标签工作,但它用列表中的最后一项重写了所有属性)

我似乎错过了一些基本的东西,但我不太确定是什么。这里有没有人知道如何使用neo4J客户机实现这一点(如果可能,请解释一下发生了什么)?我对发展领域非常陌生,我觉得在这方面我缺少了一个关键的理解

我尝试的代码将所有属性转换为最后一个节点的属性,但至少按照我的预期创建了标签:

        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();
}