使用 Merge 映射参数或通过客户端构建 Batch 操作?

2024-06-16

有什么方法可以映射使用 Merge 传入的参数吗?

理想情况下,这就是我想要做的:

合并节点(如果不存在则创建,或更新整个节点属性 - 这是动态的)

合并 (c:标签 {Id : {map}.Id}) 设置 c = {地图}

当地图是单个对象并且您仅更新单个节点时,这可以轻松完成,但我希望能够将其作为批量操作来完成。
传入 List 并获得该自动地图。

当然,我认为目前使用 Cypher Merge 不可能做到这一点,但可以使用 REST API 批处理方法来完成,但是,尚不清楚如何使用 Neo4jClient 构建批处理。

如果可能的话,如何构建一批合并操作? 我可以枚举列表,并为每个对象添加一个合并操作到批处理中。然后完整执行该批处理。

任何帮助都是极好的!


更新 所以,当我运行这段代码时,出现了一个奇怪的副作用:

        createUniqueConstraint(label, PK_Field); 
        string propKey = label + "s" ;

        //string createstr = string.Format("(e:{0} {{{1}}})", label, propKey);
        string strForEach = string.Format("(n in {{{0}}} |  MERGE (c:{1} {{{2} : n.{2}}}) SET c = n)",
            propKey, label, PK_Field);

        foreach (var entities in Neo4jDataRepository.Batch(list, 1000))
        {
            var query = client
                            .Cypher
                            .ForEach(strForEach)
                            .WithParam(propKey, entities.ToList());

            query.ExecuteWithoutResults();
            Debug.WriteLine("Batch passed for " + label + " ("+list.Count()+" items)");
            break;
        }

这工作得很好(有点)。我有相关的节点,它们也包含与 PK_Field 同名的属性,并且我最终得到具有单个属性而不是整个对象的节点。

例子: Contact { ContactId:1,name:"David" } 是对象的一种模型 ContactMembership {ContactMembershipId:1,ContactId:1,ContactMembershipTypeId:1} ContactMembershipType {ContactMembershipType:1,名称:“用户”}

运行此代码时,它首先循环遍历每个模型数组,并使用上面的 Merge 语句添加/更新数据库中的模型。 所有模型都位于数据库中后,它运行关系方法调用,该调用采用相关数据模型 ContactMembership 并使用以下代码迭代该模型:

 public void CreateNewRelationshipsFromMatrix<T>(IEnumerable<T> relationshipMatrix,   string IDFieldLeft, string IDFieldRight)
        where T : BaseModel
    {
        string entityName = GetTypeName(default(T)); //i.e. ContactAddress

        string merge1 = string.Format("(c:{0} {{{1}:row.{2}}})", IDFieldLeft.Replace("Id", ""), IDFieldLeft, IDFieldLeft);
        string merge2 = string.Format("(a:{0} {{{1}:row.{2}}})", IDFieldRight.Replace("Id", ""), IDFieldRight, IDFieldRight);
        string merge3 = string.Format("(c)-[r:{0}Link]->(a)", entityName);

        string uniqueRelationshipSetter = " ON CREATE SET r.weight=1 ON MATCH SET r.weight = r.weight + 1 ";

        foreach (var list in Neo4jDataRepository.Batch(relationshipMatrix, 1000))
        {
            var q1 = client.Cypher.Merge(merge1);
            var q2 = client.Cypher.Merge(merge2);
            var q3 = client.Cypher.Merge(merge3);

            var query = client
                        .Cypher
                        .WithParam("coll", list.ToList())
                        .ForEach("(row in {coll} | " +
                        q1.Query.QueryText + " " +
                        q2.Query.QueryText + " " +
                        q3.Query.QueryText + ")");
            query.ExecuteWithoutResults();
        }

    }

似乎在第二次调用(现有节点的关联)期间,系统使用 Label :Contact 创建新节点,仅包含 ContactId 属性,没有其他数据。 MATCH (n:Contact)-[:ContactMembership]-(t) 始终返回 n 的 ContactId 模型,而不是完整的联系人模型。

MATCH (n)-[:ContactMembership]-(t) 将返回 t 和 n 的完整模型。

不知道这里发生了什么......


FOREACH (n in {set} | MERGE (c:Label {Id : n.Id}) SET c = n)

http://docs.neo4j.org/chunked/stable/query-foreach.html http://docs.neo4j.org/chunked/stable/query-foreach.html

Update:另一个选项即将推出,您将能够在 Cypher 中编写如下内容:

LOAD CSV WITH HEADERS FROM 'file://c:/temp/input.csv' AS n
MERGE (c:Label { Id : n.Id })
SET c = n

https://github.com/davidegrohmann/neo4j/blob/2.1-fix-resource-failure-load-csv/community/cypher/cypher/src/test/scala/org/neo4j/cypher/LoadCsvAcceptanceTest.scala https://github.com/davidegrohmann/neo4j/blob/2.1-fix-resource-failure-load-csv/community/cypher/cypher/src/test/scala/org/neo4j/cypher/LoadCsvAcceptanceTest.scala

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Merge 映射参数或通过客户端构建 Batch 操作? 的相关文章

  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • 如何从 json 文件创建模型? (ExtJS)

    这是我想使用 json 文件创建的模型 Ext define Users extend Ext data Model fields name user id type int name user name type string 为了根据服

随机推荐