Esempio n. 1
0
        /// <summary>
        /// 从局部缓存中获取论文的引用次数。
        /// </summary>
        private int?CitationCount(PaperNode node)
        {
            Debug.Assert(node != null);
            int count;

            if (_CitationCountDict.TryGetValue(node.Id, out count))
            {
                return(count);
            }
            return(null);
        }
Esempio n. 2
0
        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);
            }
        }