在使用.NET客户端添加关系时如何在neo4j中使用unwind?

时间:2016-01-11 09:31:36

标签: c# neo4j neo4jclient

我刚从另一个SO答案中找到了.NET客户端上的Unwind方法。添加节点时,它就像一个魅力。但是你如何使用它添加关系?我认为这是直截了当的并且写了这个:

client.Cypher
.Unwind(idMap, "idMap")
.Match("n1", "n2")
.Where("n1.Id=idMap.Owner")
.AndWhere("n2.Id=idMap.User")
.Create("n1-[:ONE_RELATION]->n2")
.ExecuteWithoutResults()

idMap是一个列表,其中我有OwnerUser作为GUID。我也尝试将这些改为字符串而没有运气。

我得到的错误是

  

System.Threading.Tasks.TaskCanceledException:任务被取消   在   Neo4jClient.GraphClient.Neo4jClient.IRawGraphClient.ExecuteCypher(CypherQuery   查询)在D:\ temp \ 384a765 \ Neo4jClient \ GraphClient.cs:第1041行   Neo4jClient.Cypher.CypherFluentQuery.ExecuteWithoutResults()in   D:\ temp \ 384a765 \ Neo4jClient \ Cypher \ CypherFluentQuery.cs:第361行   FSI_0003.connect2IdNodesList@61.Invoke(FSharpList 1 x) in C:\dev\git\Sfag\src\Sfag.GraphView\Script.fsx:line 62 at Microsoft.FSharp.Primitives.Basics.List.iter[T](FSharpFunc 2 f,   FSharpList 1 x) at Microsoft.FSharp.Collections.ListModule.Iterate[T](FSharpFunc 2   动作,FSharpList`1列表)在FSI_0003.saveState(状态)中   C:\ dev \ git \ Sfag \ src \ Sfag.GraphView \ Script.fsx:第250行   。$ FSI_0005.main @()in   C:\ dev \ git \ Sfag \ src \ Sfag.GraphView \ Script.fsx:第265行

并没有多大帮助。谁知道我在做错了什么?我可以从文档中读到实际的neo4j API应该允许的内容:http://neo4j.com/docs/stable/cypherdoc-utilizing-data-structures.htmlhttp://neo4j.com/docs/stable/query-unwind.html

更新

批量较大时,我得到另一个错误:

  

System.ApplicationException:何时收到意外的HTTP状态   执行请求。

     

响应状态为:500服务器错误

     

Neo4j的回复(可能包括有用的细节!)是:
  在   Neo4jClient.GraphClient.Neo4jClient.IRawGraphClient.ExecuteCypher(CypherQuery   查询)在D:\ temp \ 384a765 \ Neo4jClient \ GraphClient.cs:第1041行   Neo4jClient.Cypher.CypherFluentQuery.ExecuteWithoutResults()in   D:\ temp \ 384a765 \ Neo4jClient \ Cypher \ CypherFluentQuery.cs:第361行   FSI_0003.deletAllNodesOfTags@127.Invoke(String tag)in   C:\ dev \ git \ Sfag \ src \ Sfag.GraphView \ Script.fsx:第127行

     
    

at Microsoft.FSharp.Primitives.Basics.List.mapToFreshConsTail [a,b](FSharpList 1 cons, FSharpFunc 2 f,FSharpList 1 x) at Microsoft.FSharp.Primitives.Basics.List.map[T,TResult](FSharpFunc 2     映射,FSharpList 1 x) at Microsoft.FSharp.Collections.ListModule.Map[T,TResult](FSharpFunc 2     映射,FSharpList`1列表)at     。$ FSI_0003.main @()in     C:\ dev \ git \ Sfag \ src \ Sfag.GraphView \ Script.fsx:第142行

  

1 个答案:

答案 0 :(得分:0)

好的,所以看起来我的问题是我在Id属性上没有索引。我真的不明白为什么会有所作为,当然它会加速,但崩溃?在这里保留这个问题让别人看。

我还在节点匹配中添加了标签,以缩小数据集以搜索匹配。

结尾的F#代码如下所示:

创建索引:

let createIndexes (client:GraphClient) = 
    client.Cypher
        .Create("INDEX ON :Enhet(Id)")
        .ExecuteWithoutResults()

连接ID对列表:

let connect2IdNodesList<'T  when 'T:equality> (client:GraphClient) relationType (idsToConnect: TwoIds list) = 
    let batches = List.batchesOf 10000 idsToConnect
    let startNodeType,endNodeType = getNodeTypesForRelation relationType
    let node1Str = sprintf "(n1:%s)" startNodeType
    let node2Str = sprintf "(n2:%s)" endNodeType
    batches |> List.iter (fun x -> 
                    client.Cypher
                        .Unwind(x, "idMap")
                        .Match(node1Str, node2Str)
                        .Where("n1.Id=idMap.Owner AND n2.Id=idMap.User")
                        .Create(sprintf "n1-[:%s]->n2" (relationTypeToString relationType))
                    .ExecuteWithoutResults()
            )

batchesOf创建批量输入以防万一。