Exemple #1
0
        private static void ConvertPostLinks(SiteUris uris, XmlReader r, SequentialTurtleWriter w)
        {
            var unknownLinkTypeIds = new UnknownValueStore <string>();

            while (r.Read())
            {
                switch (r.NodeType)
                {
                case XmlNodeType.Element:
                    switch (r.LocalName)
                    {
                    case "row":
                        using (var subR = r.ReadSubtree()) {
                            subR.Read();
                            ConvertPostLink(uris, subR, w, unknownLinkTypeIds);
                        }
                        break;
                    }
                    break;

                case XmlNodeType.EndElement:
                    long unknownLinkTypeIdCount = unknownLinkTypeIds.RegisteredValueCount;
                    if (unknownLinkTypeIdCount > 0)
                    {
                        ConsoleHelper.WriteWarningLine("{0} unknown LinkTypeId value(s) found: {1}", unknownLinkTypeIdCount, unknownLinkTypeIds);
                    }

                    return;
                }
            }
        }
Exemple #2
0
        private static void ConvertPostLink(SiteUris uris, XmlReader r, SequentialTurtleWriter w, UnknownValueStore <string> unknownLinkTypeIds)
        {
            if (r.MoveToAttribute("LinkTypeId"))
            {
                switch (r.Value)
                {
                case "1":                         // linked
                    if (r.MoveToAttribute("PostId"))
                    {
                        w.StartTriple(uris.CreatePostUri(r.Value));
                        if (r.MoveToAttribute("RelatedPostId"))
                        {
                            w.AddToTriple(uris.GeneralUris.LinkProperty, uris.CreatePostUri(r.Value));
                        }
                    }
                    break;

                case "3":                         // duplicate
                    if (r.MoveToAttribute("RelatedPostId"))
                    {
                        w.StartTriple(uris.CreatePostUri(r.Value));
                        if (r.MoveToAttribute("PostId"))
                        {
                            w.AddToTriple(uris.GeneralUris.DuplicateProperty, uris.CreatePostUri(r.Value));
                        }
                    }
                    break;

                default:
                    unknownLinkTypeIds.RegisterUnknownValue(r.Value);
                    break;
                }
            }
            else
            {
                r.MoveToElement();
                ConsoleHelper.WriteErrorLine("No LinkTypeId attribute found on element {0}. Skipping element.", r.ReadOuterXml());
            }
        }
        private static void ConvertVote(SiteUris uris, XmlReader r, SequentialTurtleWriter w, UnknownValueStore <string> unknownVoteTypeIds)
        {
            Uri subjectUri;

            if (r.MoveToAttribute("Id"))
            {
                subjectUri = uris.CreateVoteUri(r.Value);
                w.StartTriple(subjectUri);
            }
            else
            {
                r.MoveToElement();
                ConsoleHelper.WriteErrorLine("No Id attribute found on element {0}. Skipping element.", r.ReadOuterXml());
                return;
            }

            if (r.MoveToAttribute("VoteTypeId"))
            {
                switch (r.Value)
                {
                case "1":                         // acceptance
                    if (GlobalData.Options.FullTimeInfo)
                    {
                        w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.AcceptanceType);
                        uris.LinkToSite(w);
                        if (r.MoveToAttribute("PostId"))
                        {
                            w.StartTriple(uris.CreatePostUri(r.Value));
                            w.AddToTriple(uris.GeneralUris.AcceptanceProperty, subjectUri);
                            w.StartTriple(subjectUri);
                        }
                        if (r.MoveToAttribute("CreationDate"))
                        {
                            w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture));
                        }
                    }
                    break;

                case "2":                         // upvote
                    if (GlobalData.Options.FullTimeInfo)
                    {
                        w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.UpVoteType);
                        uris.LinkToSite(w);
                        if (r.MoveToAttribute("CreationDate"))
                        {
                            w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture));
                        }
                        if (r.MoveToAttribute("PostId"))
                        {
                            w.StartTriple(uris.CreatePostUri(r.Value));
                            w.AddToTriple(uris.GeneralUris.VoteProperty, subjectUri);
                            w.StartTriple(subjectUri);
                        }
                    }
                    break;

                case "3":                         // downvote
                    if (GlobalData.Options.FullTimeInfo)
                    {
                        w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.DownVoteType);
                        uris.LinkToSite(w);
                        if (r.MoveToAttribute("CreationDate"))
                        {
                            w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture));
                        }
                        if (r.MoveToAttribute("PostId"))
                        {
                            w.StartTriple(uris.CreatePostUri(r.Value));
                            w.AddToTriple(uris.GeneralUris.VoteProperty, subjectUri);
                            w.StartTriple(subjectUri);
                        }
                    }
                    break;

                case "4":                         // offensive
                    break;

                case "5":                         // favorite
                    if (GlobalData.Options.FullTimeInfo)
                    {
                        w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.FavoriteType);
                        uris.LinkToSite(w);
                        if (r.MoveToAttribute("CreationDate"))
                        {
                            w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture));
                        }
                        if (r.MoveToAttribute("PostId"))
                        {
                            w.AddToTriple(uris.GeneralUris.PostProperty, uris.CreatePostUri(r.Value));
                        }
                        if (r.MoveToAttribute("UserId"))
                        {
                            w.StartTriple(uris.CreateUserUri(r.Value));
                            w.AddToTriple(uris.GeneralUris.FavoriteProperty, subjectUri);
                            w.StartTriple(subjectUri);
                        }
                    }
                    else
                    {
                        if (r.MoveToAttribute("UserId"))
                        {
                            w.StartTriple(uris.CreateUserUri(r.Value));
                            if (r.MoveToAttribute("PostId"))
                            {
                                w.AddToTriple(uris.GeneralUris.FavoriteProperty, uris.CreatePostUri(r.Value));
                            }
                            w.StartTriple(subjectUri);
                        }
                    }
                    break;

                case "6":                         // closed
                    break;

                case "7":                         // reopened
                    break;

                case "8":                         // bounty started
                    w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.StartOfBountyType);
                    if (r.MoveToAttribute("PostId"))
                    {
                        w.AddToTriple(uris.GeneralUris.PostProperty, uris.CreatePostUri(r.Value));
                    }
                    if (r.MoveToAttribute("UserId"))
                    {
                        w.AddToTriple(uris.GeneralUris.DonorProperty, uris.CreateUserUri(r.Value));
                    }
                    if (r.MoveToAttribute("CreationDate"))
                    {
                        w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture));
                    }
                    if (r.MoveToAttribute("BountyAmount"))
                    {
                        w.AddToTriple(uris.GeneralUris.OfferedAmountProperty, long.Parse(r.Value));
                    }
                    break;

                case "9":                         // bounty closed
                    w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.EndOfBountyType);
                    if (r.MoveToAttribute("PostId"))
                    {
                        w.AddToTriple(uris.GeneralUris.AnswerProperty, uris.CreatePostUri(r.Value));
                    }
                    if (r.MoveToAttribute("CreationDate"))
                    {
                        w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture));
                    }
                    if (r.MoveToAttribute("BountyAmount"))
                    {
                        w.AddToTriple(uris.GeneralUris.TransferredAmountProperty, long.Parse(r.Value));
                    }
                    break;

                case "10":                         // deletion
                    break;

                case "11":                         // undeletion
                    break;

                case "12":                         // spam
                    break;

                case "13":                         // moderator informed
                    break;

                case "15":                         // under moderator review
                    break;

                case "16":                         // approved edit suggestion
                    break;

                default:
                    unknownVoteTypeIds.RegisterUnknownValue(r.Value);
                    break;
                }
            }
            else
            {
                r.MoveToElement();
                ConsoleHelper.WriteErrorLine("No VoteTypeId attribute found on element {0}. Skipping element.", r.ReadOuterXml());
            }
        }
        private static void ConvertPostHistoryItem(SiteUris uris, XmlReader r, SequentialTurtleWriter w, UnknownValueStore <string> unknownPostHistoryTypeIds)
        {
            Uri subjectUri;

            if (r.MoveToAttribute("Id"))
            {
                subjectUri = uris.CreatePostHistoryUri(r.Value);
                w.StartTriple(subjectUri);
            }
            else
            {
                r.MoveToElement();
                ConsoleHelper.WriteErrorLine("No Id attribute found on element {0}. Skipping element.", r.ReadOuterXml());
                return;
            }

            if (r.MoveToAttribute("PostHistoryTypeId"))
            {
                switch (r.Value)
                {
                case "1":                         // initial title
                    break;

                case "2":                         // initial body
                    break;

                case "3":                         // initial tags
                    break;

                case "4":                         // edit title
                    break;

                case "5":                         // edit body
                    break;

                case "6":                         // edit tags
                    break;

                case "7":                         // rollback title
                    break;

                case "8":                         // rollback body
                    break;

                case "9":                         // rollback tags
                    break;

                case "10":                         // post closed
                    w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.PostClosureType);
                    if (r.MoveToAttribute("Comment"))
                    {
                        switch (r.Value)
                        {
                        case "1":                                         // Exact Duplicate
                        case "101":                                       // duplicate
                            w.AddToTriple(uris.GeneralUris.CloseReasonProperty, uris.GeneralUris.DuplicateCloseReason);
                            break;

                        case "2":                                         // Off-topic
                        case "102":                                       // Off-topic
                            w.AddToTriple(uris.GeneralUris.CloseReasonProperty, uris.GeneralUris.OffTopicCloseReason);
                            break;

                        case "3":                                         // Subjective and argumentative
                        case "105":                                       // Primarily opinion-based
                            w.AddToTriple(uris.GeneralUris.CloseReasonProperty, uris.GeneralUris.SubjectiveCloseReason);
                            break;

                        case "4":                                         // Not a real question
                            w.AddToTriple(uris.GeneralUris.CloseReasonProperty, uris.GeneralUris.NotAQuestionCloseReason);
                            break;

                        case "7":                                         // Too localized
                            w.AddToTriple(uris.GeneralUris.CloseReasonProperty, uris.GeneralUris.TooLocalizedCloseReason);
                            break;

                        case "10":                                         // General reference
                            w.AddToTriple(uris.GeneralUris.CloseReasonProperty, uris.GeneralUris.GeneralReferenceCloseReason);
                            break;

                        case "20":                                         // Noise or pointless
                            w.AddToTriple(uris.GeneralUris.CloseReasonProperty, uris.GeneralUris.NoiseCloseReason);
                            break;

                        case "103":                                         // Unclear what you're asking
                            w.AddToTriple(uris.GeneralUris.CloseReasonProperty, uris.GeneralUris.UnclearCloseReason);
                            break;

                        case "104":                                         // Too broad
                            w.AddToTriple(uris.GeneralUris.CloseReasonProperty, uris.GeneralUris.TooBroadCloseReason);
                            break;

                        default:
                            ConsoleHelper.WriteWarningLine("Unknown post close reason: {0}", r.Value);
                            break;
                        }
                    }
                    if (r.MoveToAttribute("CreationDate"))
                    {
                        w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture));
                    }
                    AddParticipants(uris, r, w);
                    LinkToPost(uris, subjectUri, r, w);
                    break;

                case "11":                         // post reopened
                    w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.PostReopeningType);
                    if (r.MoveToAttribute("CreationDate"))
                    {
                        w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture));
                    }
                    AddParticipants(uris, r, w);
                    LinkToPost(uris, subjectUri, r, w);
                    break;

                case "12":                         // post deleted
                    w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.PostDeletionType);
                    if (r.MoveToAttribute("CreationDate"))
                    {
                        w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture));
                    }
                    AddParticipants(uris, r, w);
                    LinkToPost(uris, subjectUri, r, w);
                    break;

                case "13":                         // post undeleted
                    w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.PostUndeletionType);
                    if (r.MoveToAttribute("CreationDate"))
                    {
                        w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture));
                    }
                    AddParticipants(uris, r, w);
                    LinkToPost(uris, subjectUri, r, w);
                    break;

                case "14":                         // post locked
                    w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.PostLockingType);
                    if (r.MoveToAttribute("CreationDate"))
                    {
                        w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture));
                    }
                    AddParticipants(uris, r, w);
                    LinkToPost(uris, subjectUri, r, w);
                    break;

                case "15":                         // post unlocked
                    w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.PostUnlockingType);
                    if (r.MoveToAttribute("CreationDate"))
                    {
                        w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture));
                    }
                    AddParticipants(uris, r, w);
                    LinkToPost(uris, subjectUri, r, w);
                    break;

                case "16":                         // community owned
                    break;

                case "17":                         // post migrated superseded with 35/36
                    break;

                case "18":                         // question merged
                    break;

                case "19":                         // question protected
                    w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.PostProtectionType);
                    if (r.MoveToAttribute("CreationDate"))
                    {
                        w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture));
                    }
                    AddParticipants(uris, r, w);
                    LinkToPost(uris, subjectUri, r, w);
                    break;

                case "20":                         // question unprotected
                    w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.PostUnprotectionType);
                    if (r.MoveToAttribute("CreationDate"))
                    {
                        w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture));
                    }
                    AddParticipants(uris, r, w);
                    LinkToPost(uris, subjectUri, r, w);
                    break;

                case "21":                         // post disassociated
                    break;

                case "22":                         // question unmerged
                    break;

                case "24":                         // suggested edit applied
                    break;

                case "25":                         // post tweeted
                    break;

                case "31":                         // comment discussion moved to chat
                    break;

                case "33":                         // post notice added
                    break;

                case "34":                         // post notice removed
                    break;

                case "35":                         // post migrated away replaces 17
                    break;

                case "36":                         // post migrated here replaces 17
                    break;

                case "37":                         // post merge source
                    break;

                case "38":                         // post merge destination
                    break;

                default:
                    unknownPostHistoryTypeIds.RegisterUnknownValue(r.Value);
                    break;
                }
            }
            else
            {
                r.MoveToElement();
                ConsoleHelper.WriteErrorLine("No PostHistoryTypeId attribute found on element {0}. Skipping element.", r.ReadOuterXml());
            }
        }
        private static void ConvertPost(SiteUris uris, XmlReader r, SequentialTurtleWriter w, UnknownValueStore <string> unknownPostTypeIds)
        {
            Uri subjectUri;

            if (r.MoveToAttribute("Id"))
            {
                subjectUri = uris.CreatePostUri(r.Value);
                w.StartTriple(subjectUri);
            }
            else
            {
                r.MoveToElement();
                ConsoleHelper.WriteErrorLine("No Id attribute found on element {0}. Skipping element.", r.ReadOuterXml());
                return;
            }

            if (r.MoveToAttribute("PostTypeId"))
            {
                switch (r.Value)
                {
                case "1":                         // question
                    w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.QuestionType);
                    uris.LinkToSite(w);
                    if (r.MoveToAttribute("AcceptedAnswerId"))
                    {
                        w.AddToTriple(uris.GeneralUris.AcceptedAnswerProperty, uris.CreatePostUri(r.Value));
                    }
                    if (r.MoveToAttribute("ViewCount"))
                    {
                        w.AddToTriple(uris.GeneralUris.ViewCountProperty, long.Parse(r.Value));
                    }
                    if (r.MoveToAttribute("Title"))
                    {
                        w.AddToTriple(uris.GeneralUris.TitleProperty, r.Value);
                        w.AddToTriple(uris.GeneralUris.LabelProperty, r.Value);
                    }
                    if (r.MoveToAttribute("Score"))
                    {
                        w.AddToTriple(uris.GeneralUris.ScoreProperty, long.Parse(r.Value));
                    }
                    break;

                case "2":                         // answer
                    w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.AnswerType);
                    uris.LinkToSite(w);
                    if (r.MoveToAttribute("ParentId"))
                    {
                        w.StartTriple(uris.CreatePostUri(r.Value));
                        w.AddToTriple(uris.GeneralUris.AnswerProperty, subjectUri);
                        w.StartTriple(subjectUri);
                    }
                    else
                    {
                        ConsoleHelper.WriteWarningLine("Orphaned answer: {0}", subjectUri);
                    }
                    if (r.MoveToAttribute("Score"))
                    {
                        w.AddToTriple(uris.GeneralUris.ScoreProperty, long.Parse(r.Value));
                    }
                    break;

                case "3":                         // orphaned tag wiki
                    break;

                case "4":                         // tag info excerpt
                    w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.TagExcerptType);
                    break;

                case "5":                         // tag description
                    w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.TagDescriptionType);
                    break;

                case "6":                         // moderator nomination
                    break;

                case "7":                         // "Wiki placeholder" (seems to only be the election description)
                    //w.AddToTriple(uris.GeneralUris.TypeProperty, uris.GeneralUris.SiteInfoType);
                    break;

                default:
                    unknownPostTypeIds.RegisterUnknownValue(r.Value);
                    break;
                }
                if (r.MoveToAttribute("CreationDate"))
                {
                    w.AddToTriple(uris.GeneralUris.DateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture));
                }
                if (r.MoveToAttribute("LastEditDate"))
                {
                    w.AddToTriple(uris.GeneralUris.LastEditDateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture));
                }
                if (r.MoveToAttribute("LastActivity"))
                {
                    w.AddToTriple(uris.GeneralUris.LastActivityDateProperty, DateTime.Parse(r.Value, System.Globalization.CultureInfo.InvariantCulture));
                }
                if (r.MoveToAttribute("OwnerUserId"))
                {
                    w.AddToTriple(uris.GeneralUris.OwnerProperty, uris.CreateUserUri(r.Value));
                }
                // TODO: LastEditorUserId (given in post history)
                // TODO: FavoriteCount (linked to users?)
                if (r.MoveToAttribute("Body"))
                {
                    w.AddToTriple(uris.GeneralUris.DescriptionProperty, r.Value);
                }
                if (r.MoveToAttribute("Tags"))
                {
                    w.AddToTriple(uris.GeneralUris.TagProperty,
                                  tagRegex.Matches(r.Value).Cast <Match>().Select(m => uris.CreateTagUri(m.Groups[1].Value)));
                }
            }
            else
            {
                r.MoveToElement();
                ConsoleHelper.WriteErrorLine("No PostTypeId attribute found on element {0}. Skipping element.", r.ReadOuterXml());
            }
        }