/// <summary> /// 从局部缓存中获取论文的引用次数。 /// </summary> private int?CitationCount(PaperNode node) { Debug.Assert(node != null); int count; if (_CitationCountDict.TryGetValue(node.Id, out count)) { return(count); } return(null); }
private async Task FetchCitationsToPaperAsync(PaperNode paper, string constraint, ConcurrentPagingMode pagingMode) { Debug.Assert(paper != null); if (constraint == null) { if (!await GetStatus(paper.Id).MarkAsFetchingOrUntilFetched(NodeStatus.PaperCitationsFetching)) { return; } } // 一般来说, Paper2 肯定就是题目中的终结点, // 因此我们是知道其具体信息的。 var maxPapers = CitationCount(paper); var strategy = maxPapers == null ? ConcurrentPagingMode.Optimistic : pagingMode; if (maxPapers == null) { maxPapers = Assumptions.PaperMaxCitations; } var expr = SEB.ReferenceIdContains(paper.Id); if (constraint != null) { expr = SEB.And(expr, constraint); } await SearchClient.EvaluateAsync(expr, maxPapers.Value, strategy, async page => { await Task.WhenAll(page.Entities.Select(entity => { RegisterNode(entity); return(ExplorePaperAsync(entity)); })); }); if (constraint == null) { GetStatus(paper.Id).MarkAsFetched(NodeStatus.PaperCitationsFetching); } }