我刚从另一个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
是一个列表,其中我有Owner
和User
作为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, FSharpList1 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.html,http://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,FSharpList1 x) at Microsoft.FSharp.Primitives.Basics.List.map[T,TResult](FSharpFunc
2 映射,FSharpList1 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行
答案 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
创建批量输入以防万一。