private static void WriteUnionPropIfNecessary(SequentialTurtleWriter w, Uri propUri, IList <Uri> objects)
 {
     if (objects.Count > 0)
     {
         if (objects.Count == 1)
         {
             w.AddToTriple(propUri, objects[0]);
         }
         else
         {
             w.AddAnonymousToTriple(propUri);
             w.AddToTriple(typeUri, new Uri(NamespaceMapper.OWL + "Class"));
             w.AddToTriple(new Uri(NamespaceMapper.OWL + "unionOf"), true, objects);
             w.FinishAnonymousNode();
         }
     }
 }
        private static void WriteOntologyDefinitions(GeneralUris generalUris, SequentialTurtleWriter w)
        {
            // ontology metadata

            string ontologyUri = generalUris.OntologyPrefix.AbsoluteUri ?? "";

            if (ontologyUri.Length > 0)
            {
                switch (ontologyUri[ontologyUri.Length - 1])
                {
                case '/':
                case '#':
                    ontologyUri = ontologyUri.Substring(0, ontologyUri.Length - 1);
                    break;
                }
            }
            w.StartTriple(new Uri(ontologyUri));
            w.AddToTriple(generalUris.TypeProperty, new Uri(NamespaceMapper.OWL + "Ontology"));
            w.AddToTriple(generalUris.TitleProperty, "SE2Rdf Output");
            w.AddToTriple(generalUris.DateProperty, DateTime.Now);
            w.AddToTriple(new Uri(NamespaceMapper.OWL + "imports"), new Uri("http://purl.org/dc/elements/1.1"));             // TODO: is this correct/requierd?

            // types

            Uri postType = new Uri(generalUris.OntologyPrefix.AbsoluteUri + "Post");

            WriteClassDecl(w, generalUris.QuestionType, "Question");
            w.AddToTriple(subClassOfUri, postType);
            w.AddAnonymousToTriple(subClassOfUri);
            // TODO: does not seem to work yet in VOWL => test in Protege
            //w.AddToTriple(generalUris.TypeProperty, restrictionUri);
            w.AddToTriple(new Uri(NamespaceMapper.OWL + "onProperty"), generalUris.TitleProperty);
            w.AddToTriple(new Uri(NamespaceMapper.OWL + "cardinality"), 1);
            w.FinishAnonymousNode();

            WriteClassDecl(w, generalUris.AnswerType, "Answer");
            w.AddToTriple(subClassOfUri, postType);

            Uri tagWikiType = new Uri(generalUris.OntologyPrefix.AbsoluteUri + "TagWiki");

            WriteClassDecl(w, generalUris.TagExcerptType, "Tag Excerpt");
            w.AddToTriple(subClassOfUri, tagWikiType);
            WriteClassDecl(w, generalUris.TagDescriptionType, "Tag Description");
            w.AddToTriple(subClassOfUri, tagWikiType);

            WriteClassDecl(w, generalUris.SiteInfoType, "Q&A Site");
            WriteClassDecl(w, generalUris.UserType, "Site-specific User");

            WriteClassDecl(w, generalUris.AccountType, "Account");
            w.AddToTriple(subClassOfUri, generalUris.PersonType);

            WriteClassDecl(w, generalUris.CommentType, "Comment");
            WriteClassDecl(w, generalUris.TagType, "Tag");
            WriteClassDecl(w, generalUris.AcceptanceType, "Acceptance");

            Uri voteType = new Uri(generalUris.OntologyPrefix.AbsoluteUri + "Vote");

            WriteClassDecl(w, voteType, "Vote");
            WriteClassDecl(w, generalUris.UpVoteType, "Upvote");
            w.AddToTriple(subClassOfUri, voteType);
            WriteClassDecl(w, generalUris.DownVoteType, "Downvote");
            w.AddToTriple(subClassOfUri, voteType);

            WriteClassDecl(w, generalUris.FavoriteType, "Favorite");
            WriteClassDecl(w, generalUris.BadgeType, "Badge");
            WriteClassDecl(w, generalUris.AssignedBadgeType, "Assigned Badge");

            Uri postActionType = new Uri(generalUris.OntologyPrefix.AbsoluteUri + "PostAction");

            WriteClassDecl(w, postActionType, "Post Action");
            WriteClassDecl(w, generalUris.PostClosureType, "Closure");
            w.AddToTriple(subClassOfUri, postActionType);
            WriteClassDecl(w, generalUris.PostReopeningType, "Reopening");
            w.AddToTriple(subClassOfUri, postActionType);
            WriteClassDecl(w, generalUris.PostDeletionType, "Deletion");
            w.AddToTriple(subClassOfUri, postActionType);
            WriteClassDecl(w, generalUris.PostUndeletionType, "Undeletion");
            w.AddToTriple(subClassOfUri, postActionType);
            WriteClassDecl(w, generalUris.PostLockingType, "Locking");
            w.AddToTriple(subClassOfUri, postActionType);
            WriteClassDecl(w, generalUris.PostUnlockingType, "Unlocking");
            w.AddToTriple(subClassOfUri, postActionType);
            WriteClassDecl(w, generalUris.PostProtectionType, "Protection");
            w.AddToTriple(subClassOfUri, postActionType);
            WriteClassDecl(w, generalUris.PostUnprotectionType, "Unprotection");
            w.AddToTriple(subClassOfUri, postActionType);

            WriteClassDecl(w, generalUris.StartOfBountyType, "Start of Bounty");
            WriteClassDecl(w, generalUris.EndOfBountyType, "End of Bounty");
            WriteClassDecl(w, generalUris.CloseReasonType, "Close Reason");

            // properties

            WritePropDecl(w, generalUris.StackExchangeWebsiteProperty, true,
                          new[] { postType, generalUris.TagType, generalUris.UserType, generalUris.BadgeType },
                          new[] { generalUris.SiteInfoType });
            WritePropDecl(w, generalUris.ScoreProperty, false,
                          new[] { generalUris.CommentType, postType },
                          new[] { new Uri(NamespaceMapper.XMLSCHEMA + "integer") });
            WritePropDecl(w, generalUris.OwnerProperty, true,
                          new[] { generalUris.CommentType, postType, tagWikiType },
                          new[] { generalUris.UserType });
            WritePropDecl(w, generalUris.CloseReasonProperty, true,
                          new[] { generalUris.PostClosureType },
                          new[] { generalUris.CloseReasonType });
            WritePropDecl(w, generalUris.ParticipantProperty, true,
                          new[] { postActionType },
                          new[] { generalUris.UserType });
            WritePropDecl(w, generalUris.CommentProperty, true,
                          new[] { postType },
                          new[] { generalUris.CommentType });
            WritePropDecl(w, generalUris.ViewCountProperty, false,
                          new[] { generalUris.QuestionType, generalUris.UserType, generalUris.AccountType },
                          new[] { new Uri(NamespaceMapper.XMLSCHEMA + "integer") });
            WritePropDecl(w, generalUris.TagProperty, true,
                          new[] { postType },             // TODO: verify!
                          new[] { generalUris.TagType });
            WritePropDecl(w, generalUris.AnswerProperty, true,
                          new[] { generalUris.QuestionType, generalUris.EndOfBountyType },
                          new[] { generalUris.AnswerType });

            WritePropDecl(w, generalUris.AcceptedAnswerProperty, true,
                          new[] { generalUris.QuestionType },
                          new[] { generalUris.AnswerType });
            w.AddToTriple(subPropertyOfUri, generalUris.AnswerProperty);

            WritePropDecl(w, generalUris.LastEditDateProperty, false,
                          new[] { postType, tagWikiType },
                          new[] { new Uri(NamespaceMapper.XMLSCHEMA + "dateTime") });
            WritePropDecl(w, generalUris.DuplicateProperty, true,
                          new[] { generalUris.QuestionType },
                          new[] { generalUris.QuestionType },
                          new Uri(NamespaceMapper.OWL + "IrreflexiveProperty"));
            WritePropDecl(w, generalUris.EventProperty, true,
                          new[] { postType },
                          new[] { postActionType });
            WritePropDecl(w, generalUris.TagExcerptProperty, true,
                          new[] { generalUris.TagType },
                          new[] { generalUris.TagExcerptType });
            WritePropDecl(w, generalUris.TagDescriptionProperty, true,
                          new[] { generalUris.TagType },
                          new[] { generalUris.TagDescriptionType });
            WritePropDecl(w, generalUris.BadgeProperty, true,
                          new[] { generalUris.UserType },
                          new[] { generalUris.BadgeType });
            WritePropDecl(w, generalUris.ReputationProperty, false,
                          new[] { generalUris.UserType },
                          new[] { new Uri(NamespaceMapper.XMLSCHEMA + "integer") });
            WritePropDecl(w, generalUris.UpVotesProperty, false,
                          new[] { generalUris.UserType },
                          new[] { new Uri(NamespaceMapper.XMLSCHEMA + "integer") });
            WritePropDecl(w, generalUris.DownVotesProperty, false,
                          new[] { generalUris.UserType },
                          new[] { new Uri(NamespaceMapper.XMLSCHEMA + "integer") });
            WritePropDecl(w, generalUris.AccountProperty, true,
                          new[] { generalUris.UserType },
                          new[] { generalUris.AccountType });
            w.AddToTriple(generalUris.TypeProperty, new Uri(NamespaceMapper.OWL + "FunctionalProperty"));
            WritePropDecl(w, generalUris.LastSeenProperty, false,
                          new[] { generalUris.UserType },
                          new[] { new Uri(NamespaceMapper.XMLSCHEMA + "dateTime") });
            WritePropDecl(w, generalUris.FavoriteProperty, true,
                          new[] { generalUris.UserType },
                          new[] { generalUris.QuestionType });
            WritePropDecl(w, generalUris.IsMetaSiteProperty, false,
                          new[] { generalUris.SiteInfoType },
                          new[] { new Uri(NamespaceMapper.XMLSCHEMA + "boolean") });
            WritePropDecl(w, generalUris.ParentSiteProperty, true,
                          new[] { generalUris.SiteInfoType },
                          new[] { generalUris.SiteInfoType },
                          new Uri(NamespaceMapper.OWL + "IrreflexiveProperty"));
            WritePropDecl(w, generalUris.PostProperty, true,
                          new[] { generalUris.StartOfBountyType },
                          new[] { generalUris.QuestionType });
            WritePropDecl(w, generalUris.DonorProperty, true,
                          new[] { generalUris.StartOfBountyType },
                          new[] { generalUris.UserType });
            WritePropDecl(w, generalUris.OfferedAmountProperty, false,
                          new[] { generalUris.StartOfBountyType },
                          new[] { new Uri(NamespaceMapper.XMLSCHEMA + "integer") });
            WritePropDecl(w, generalUris.TransferredAmountProperty, false,
                          new[] { generalUris.EndOfBountyType },
                          new[] { new Uri(NamespaceMapper.XMLSCHEMA + "integer") });
        }