Example #1
0
        private void GraphDBRequests()
        {
            Console.WriteLine("performing DB requests...");
            #region define type "Tag"

            //create a VertexTypePredefinition
            var Tag_VertexTypePredefinition = new VertexTypePredefinition("Tag");

            //create property
            var PropertyName = new PropertyPredefinition("Name", "String")
                               .SetComment("This is a property on type 'Tag' named 'Name' and is of type 'String'");

            //add property
            Tag_VertexTypePredefinition.AddProperty(PropertyName);

            //create outgoing edge to "Website"
            var OutgoingEdgesTaggedWebsites = new OutgoingEdgePredefinition("TaggedWebsites", "Website")
                                              .SetMultiplicityAsMultiEdge()
                                              .SetComment(@"This is an outgoing edge on type 'Tag' wich points to the type 'Website' (the AttributeType) 
                                                                            and is defined as 'MultiEdge', which means that this edge can contain multiple single edges");

            //add outgoing edge
            Tag_VertexTypePredefinition.AddOutgoingEdge(OutgoingEdgesTaggedWebsites);

            #endregion

            #region define type "Website"

            //create a VertexTypePredefinition
            var Website_VertexTypePredefinition = new VertexTypePredefinition("Website");

            //create properties
            PropertyName = new PropertyPredefinition("Name", "String")
                           .SetComment("This is a property on type 'Website' named 'Name' and is of type 'String'");

            var PropertyUrl = new PropertyPredefinition("URL", "String")
                              .SetAsMandatory();

            //add properties
            Website_VertexTypePredefinition.AddProperty(PropertyName);
            Website_VertexTypePredefinition.AddProperty(PropertyUrl);

            #region create an index on type "Website" on property "Name"
            //there are three ways to set an index on property "Name"
            //Beware: Use just one of them!

            //1. create an index definition and specifie the property- and type name
            var MyIndex = new IndexPredefinition("MyIndex").SetIndexType("SonesIndex").AddProperty("Name").SetVertexType("Website");
            //add index
            Website_VertexTypePredefinition.AddIndex((IndexPredefinition)MyIndex);

            //2. on creating the property definition of property "Name" call the SetAsIndexed() method, the GraphDB will create the index
            //PropertyName = new PropertyPredefinition("Name")
            //                           .SetAttributeType("String")
            //                           .SetComment("This is a property on type 'Website' with name 'Name' and is of type 'String'")
            //                           .SetAsIndexed();

            //3. make a create index request, like creating a type
            //BEWARE: This statement must be execute AFTER the type "Website" is created.
            //var MyIndex = GraphDSServer.CreateIndex<IIndexDefinition>(SecToken,
            //                                                          TransToken,
            //                                                          new RequestCreateIndex(
            //                                                          new IndexPredefinition("MyIndex")
            //                                                                   .SetIndexType("SonesIndex")
            //                                                                   .AddProperty("Name")
            //                                                                   .SetVertexType("Website")), (Statistics, Index) => Index);

            #endregion

            //add IncomingEdge "Tags", the related OutgoingEdge is "TaggedWebsites" on type "Tag"
            Website_VertexTypePredefinition.AddIncomingEdge(new IncomingEdgePredefinition("Tags",
                                                                                          "Tag",
                                                                                          "TaggedWebsites"));

            #endregion


            #region create types by sending requests

            //create the types "Tag" and "Website"
            var DBTypes = GraphDSClient.CreateVertexTypes <IEnumerable <IVertexType> >(SecToken,
                                                                                       TransToken,
                                                                                       new RequestCreateVertexTypes(
                                                                                           new List <VertexTypePredefinition> {
                Tag_VertexTypePredefinition,
                Website_VertexTypePredefinition
            }),
                                                                                       (Statistics, VertexTypes) => VertexTypes);

            /*
             * BEWARE: The following two operations won't work because the two types "Tag" and "Website" depending on each other,
             *          because one type has an incoming edge to the other and the other one has an incoming edge,
             *          so they cannot be created separate (by using create type),
             *          they have to be created at the same time (by using create types)
             *
             * //create the type "Website"
             * var Website = GraphDSServer.CreateVertexType<IVertexType>(SecToken,
             *                                                           TransToken,
             *                                                           new RequestCreateVertexType(Website_VertexTypePredefinition),
             *                                                           (Statistics, VertexType) => VertexType);
             *
             * //create the type "Tag"
             * var Tag = GraphDSServer.CreateVertexType<IVertexType>(SecToken,
             *                                                       TransToken,
             *                                                       new RequestCreateVertexType(Tag_VertexTypePredefinition),
             *                                                       (Statistics, VertexType) => VertexType);
             */

            var Tag = DBTypes.Where(type => type.Name == "Tag").FirstOrDefault();
            if (Tag != null)
            {
                Console.WriteLine("Vertex Type 'Tag' created");
            }
            var Website = DBTypes.Where(type => type.Name == "Website").FirstOrDefault();
            if (Website != null)
            {
                Console.WriteLine("Vertex Type 'Website' created");
            }

            #endregion

            #region insert some Websites by sending requests

            var sones = GraphDSClient.Insert <IVertex>(SecToken, TransToken, new RequestInsertVertex("Website")
                                                       .AddStructuredProperty("Name", "Sones")
                                                       .AddStructuredProperty("URL", "http://sones.com/"),
                                                       (Statistics, Result) => Result);

            var cnn = GraphDSClient.Insert <IVertex>(SecToken, TransToken, new RequestInsertVertex("Website")
                                                     .AddStructuredProperty("Name", "CNN")
                                                     .AddStructuredProperty("URL", "http://cnn.com/"),
                                                     (Statistics, Result) => Result);

            var xkcd = GraphDSClient.Insert <IVertex>(SecToken, TransToken, new RequestInsertVertex("Website")
                                                      .AddStructuredProperty("Name", "xkcd")
                                                      .AddStructuredProperty("URL", "http://xkcd.com/"),
                                                      (Statistics, Result) => Result);

            var onion = GraphDSClient.Insert <IVertex>(SecToken, TransToken, new RequestInsertVertex("Website")
                                                       .AddStructuredProperty("Name", "onion")
                                                       .AddStructuredProperty("URL", "http://theonion.com/"),
                                                       (Statistics, Result) => Result);

            //adding an unknown property means the property isn't defined before
            var test = GraphDSClient.Insert <IVertex>(SecToken, TransToken, new RequestInsertVertex("Website")
                                                      .AddStructuredProperty("Name", "Test")
                                                      .AddStructuredProperty("URL", "")
                                                      .AddUnknownProperty("Unknown", "unknown property"),
                                                      (Statistics, Result) => Result);

            if (sones != null)
            {
                Console.WriteLine("Website 'sones' successfully inserted");
            }

            if (cnn != null)
            {
                Console.WriteLine("Website 'cnn' successfully inserted");
            }

            if (xkcd != null)
            {
                Console.WriteLine("Website 'xkcd' successfully inserted");
            }

            if (onion != null)
            {
                Console.WriteLine("Website 'onion' successfully inserted");
            }

            if (test != null)
            {
                Console.WriteLine("Website 'test' successfully inserted");
            }

            #endregion

            #region insert some Tags by sending requests

            //insert a "Tag" with an OutgoingEdge to a "Website" include that the GraphDB creates an IncomingEdge on the given Website instances
            //(because we created an IncomingEdge on type "Website") --> as a consequence we never have to set any IncomingEdge
            var good = GraphDSClient.Insert <IVertex>(SecToken, TransToken, new RequestInsertVertex("Tag")
                                                      .AddStructuredProperty("Name", "good")
                                                      .AddEdge(new EdgePredefinition("TaggedWebsites")
                                                               .AddVertexID(Website.ID, cnn.VertexID)
                                                               .AddVertexID(Website.ID, xkcd.VertexID)),
                                                      (Statistics, Result) => Result);

            var funny = GraphDSClient.Insert <IVertex>(SecToken, TransToken, new RequestInsertVertex("Tag")
                                                       .AddStructuredProperty("Name", "funny")
                                                       .AddEdge(new EdgePredefinition("TaggedWebsites")
                                                                .AddVertexID(Website.ID, xkcd.VertexID)
                                                                .AddVertexID(Website.ID, onion.VertexID)),
                                                       (Statistics, Result) => Result);

            if (good != null)
            {
                Console.WriteLine("Tag 'good' successfully inserted");
            }

            if (funny != null)
            {
                Console.WriteLine("Tag 'funny' successfully inserted");
            }

            #endregion

            #region how to get a type from the DB, properties of the type, instances of a specific type and read out property values

            //how to get a type from the DB
            var TagDBType = GraphDSClient.GetVertexType <IVertexType>(SecToken, TransToken, new RequestGetVertexType(Tag.Name), (Statistics, Type) => Type);

            //how to get a type from the DB
            var WebsiteDBType = GraphDSClient.GetVertexType <IVertexType>(SecToken, TransToken, new RequestGetVertexType(Website.Name), (Statistics, Type) => Type);

            //read informations from type
            var typeName = TagDBType.Name;
            //are there other types wich extend the type "Tag"
            var hasChildTypes = TagDBType.HasChildTypes;

            var hasPropName = TagDBType.HasProperty("Name");

            //get the definition of the property "Name"
            var propName = TagDBType.GetPropertyDefinition("Name");

            //how to get all instances of a type from the DB
            var TagInstances = GraphDSClient.GetVertices(SecToken, TransToken, new RequestGetVertices(TagDBType.Name), (Statistics, Vertices) => Vertices);

            foreach (var item in TagInstances)
            {
                //to get the value of a property of an instance, you need the property ID
                //(that's why we fetched the type from DB an read out the property definition of property "Name")
                var name = item.GetPropertyAsString(propName.ID);
            }

            Console.WriteLine("API operations finished...");

            #endregion
        }