有什么方法可以映射使用 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 的完整模型。
不知道这里发生了什么......