public static void CreateUser() { using (ServerClientSession session = new ServerClientSession(systemDir, systemHost)) { session.BeginUpdate(); Graph g = Graph.Open(session); VertexType movieType = g.FindVertexType("MOVIE"); PropertyType movieTitleType = movieType.FindProperty("TITLE"); PropertyType movieYearType = movieType.FindProperty("YEAR"); for (int i = 1; i < 50; i++) { Vertex mVickyCB = movieType.NewVertex(); mVickyCB.SetProperty(movieTitleType, "Vicky Cristina Barcelona" + i); mVickyCB.SetProperty(movieYearType, (int)(2008 + i)); session.Commit(); session.BeginUpdate(); Thread.Sleep(1000); } } }
static void Main(string[] args) { bool import = args.Length > 0 && args[0].ToLower() == "-import"; bool dirExist = Directory.Exists(s_systemDir); SessionBase.ClearAllCachedObjectsWhenDetectingUpdatedDatabase = false; if (import || !dirExist) { if (dirExist) { Directory.Delete(s_systemDir, true); // remove systemDir from prior runs and all its databases. } Directory.CreateDirectory(s_systemDir); using (SessionNoServer session = new SessionNoServer(s_systemDir)) { DataCache.MaximumMemoryUse = 12000000000; // 12 GB, set this to what fits your case SessionBase.BTreeAddFastTransientBatchSize = 10; // reduces memory usage Vertex[] ratingVertices = new Vertex[10]; session.BeginUpdate(); session.DefaultDatabaseLocation().CompressPages = PageInfo.compressionKind.LZ4; Graph g = new Graph(session); // SCHEMA VertexType userType = g.NewVertexType("User"); PropertyType genderType = userType.NewProperty("Gender", DataType.Integer, PropertyKind.Indexed); VertexType ratingType = g.NewVertexType("Rating"); PropertyType ratingValuePropertyType = ratingType.NewProperty("RatingValue", DataType.Integer, PropertyKind.Indexed); EdgeType ratingEdgeType = g.NewEdgeType("UserToRating", true, userType, ratingType); EdgeType ratingOfType = g.NewEdgeType("RatingOf", false, userType, userType); PropertyType ratingEdgePropertyType = ratingOfType.NewProperty("Rating", DataType.Integer, PropertyKind.Indexed); // DATA using (FileStream stream = File.OpenRead(System.IO.Path.Combine(s_inputDataDir, "gender.dat"))) { using (StreamReader file = new System.IO.StreamReader(stream)) { string line; int lineNumber = 0; while ((line = file.ReadLine()) != null) { lineNumber++; string[] fields = line.Split(','); Vertex aUser = userType.NewVertex(); aUser.SetProperty(genderType, (int)fields[1][0] == 'M' ? Gender.Male : fields[1][0] == 'F' ? Gender.Female : Gender.Unknown); } Console.WriteLine("Done importing " + lineNumber + " users"); } } using (FileStream stream = File.OpenRead(System.IO.Path.Combine(s_inputDataDir, "ratings.dat"))) { using (StreamReader file = new System.IO.StreamReader(stream)) { string line; int lineNumber = 0; Vertex rater = null; int raterId; int priorRaterId = -1; while ((line = file.ReadLine()) != null) { lineNumber++; if (lineNumber % 1000000 == 0) { Console.WriteLine("Parsing rating # " + lineNumber); } string[] fields = line.Split(','); raterId = int.Parse(fields[0]); if (raterId != priorRaterId) { rater = userType.GetVertex(raterId); } priorRaterId = raterId; int ratedId = int.Parse(fields[1]); int rating = int.Parse(fields[2]); Vertex ratingVertex = ratingVertices[rating - 1]; if (ratingVertex == null) { ratingVertex = ratingType.NewVertex(); ratingVertex.SetProperty(ratingValuePropertyType, rating); ratingVertices[rating - 1] = ratingVertex; } Vertex rated = userType.GetVertex(ratedId); Edge aRatingOf = ratingOfType.NewEdge(rater, rated); aRatingOf.SetProperty(ratingEdgePropertyType, rating); Edge userRating = ratingEdgeType.NewEdge(rated, ratingVertex); } Console.WriteLine("Done importing " + lineNumber + " ratings"); } } session.Commit(); } } // Query using (SessionNoServer session = new SessionNoServer(s_systemDir)) { session.BeginRead(); Graph g = Graph.Open(session); VertexType userType = g.FindVertexType("User"); PropertyType genderType = userType.FindProperty("Gender"); VertexType ratingType = g.FindVertexType("Rating"); PropertyType ratingValuePropertyType = ratingType.FindProperty("RatingValue"); EdgeType ratingEdgeType = g.FindEdgeType("UserToRating"); EdgeType ratingOfType = g.FindEdgeType("RatingOf"); PropertyType ratingEdgePropertyType = ratingOfType.FindProperty("Rating"); // Complex queries int ct = 0; // Given a user id, and based on the rated profiles, find other users who have rated similarly on the same profiles, and find other profiles to recommend based on what those other users have rated Vertex someUser = userType.GetVertex(1); var similarRatings = (from Edge e in someUser.GetEdges(ratingOfType, Direction.Out) from Edge edge in e.Head.GetEdges(ratingOfType, Direction.Out) where someUser != edge.Head where ((int)e.GetProperty(ratingEdgePropertyType) == (int)edge.GetProperty(ratingEdgePropertyType)) select edge.Tail).Distinct(); var someUserRated = from Edge e in someUser.GetEdges(ratingOfType, Direction.Out) select e.Head; var recommendedProfles = from v in similarRatings from Edge e in v.GetEdges(ratingOfType, Direction.Out) where someUserRated.Contains(e.Head) == false select e.Head; Console.WriteLine("Some user's rated profiles"); ct = 0; foreach (Vertex v in someUserRated) { if (ct++ % 50 == 0) // don't print them all ! { Console.WriteLine("User id: " + v.VertexId); } } Console.WriteLine("Number of some user's rated profiles: " + ct); Console.WriteLine("Given a user id, and based on the rated profiles, find other users who have rated similarly on the same profiles"); ct = 0; foreach (Vertex v in similarRatings) { if (ct++ % 50 == 0) // don't print them all ! { Console.WriteLine("User id: " + v.VertexId); } } Console.WriteLine("Number of matching profiles: " + ct); Console.WriteLine("Given a user id, and based on the rated profiles, find other users who have rated similarly on the same profiles, and find other profiles to recommend based on what those other users have rated"); ct = 0; foreach (Vertex v in recommendedProfles) { if (ct++ % 5000 == 0) // don't print them all ! { Console.WriteLine("User id: " + v.VertexId); } } Console.WriteLine("Number of matching profiles: " + ct); // Get all female users with less than 50 ratings Console.WriteLine(); var females = from u in userType.GetVertices() where ((Gender)u.GetProperty(genderType)) == Gender.Female select u; var femalesLess50Ratings = from f in females where f.GetNumberOfEdges(ratingEdgeType, Direction.Out) < 50 select f; Console.WriteLine("Female users with less than 50 ratings"); ct = 0; foreach (Vertex f in femalesLess50Ratings) { long count = f.GetNumberOfEdges(ratingEdgeType, Direction.Out); if (ct++ % 5000 == 0) // don't print them all ! { Console.WriteLine("User id: " + f.VertexId + "\tnumber of ratings: " + count); } } Console.WriteLine("Number of females with fewer than 50 ratings: " + ct); Console.WriteLine(); // Get all male users with at least one 10 rating Console.WriteLine(); var rated10vertex = (from v in ratingType.GetVertices() where ((int)v.GetProperty(ratingValuePropertyType)) == 10 select v).First(); var rated10 = (from e in rated10vertex.GetEdges(ratingEdgeType, Direction.In) select e.GetVertex(Direction.Out)).Distinct(); var rated10male = from Vertex v in rated10 where ((Gender)v.GetProperty(genderType)) == Gender.Male select v; Console.WriteLine("Males with at least one 10 rating"); ct = 0; foreach (Vertex v in rated10male) { if (ct++ % 5000 == 0) // don't print them all ! { Console.WriteLine("User id: " + v.VertexId); } } Console.WriteLine("Number of males with at least one 10 rating: " + ct); Console.WriteLine(); // Get the first 10 male users who have rated at least 3 of the same profiles as the given user. Console.WriteLine("10 male users who have rated at least 3 of the same profiles as the given user"); var males = from u in userType.GetVertices() where ((Gender)u.GetProperty(genderType)) == Gender.Male select u; var someUserHasRated = from Edge o in someUser.GetEdges(ratingOfType, Direction.Out) select o.Head; var first10withSame3ratedAs = from m in males where (from Edge r in m.GetEdges(ratingOfType, Direction.Out) select r.Head).Intersect(someUserHasRated).ToArray().Length >= 3 select m; ct = 0; foreach (Vertex v in first10withSame3ratedAs) { if (++ct > 10) { break; } Console.WriteLine("User id: " + v.VertexId); } Console.WriteLine(); // Statistical queries // Get the 20 profiles with the most ratings var top20mostRatings = (from v in userType.GetVertices() orderby v.GetNumberOfEdges(ratingEdgeType, Direction.Out) descending select v).Take(20); Console.WriteLine("20 profiles with the most ratings"); ct = 0; foreach (Vertex v in top20mostRatings) { int count = (int)v.GetNumberOfEdges(ratingEdgeType, Direction.Out); Console.WriteLine("User id: " + v.VertexId + "\tnumber of ratings: " + count); } Console.WriteLine(); var ratingsVertexEnum = from v in ratingType.GetVertices() orderby v.GetProperty(ratingValuePropertyType) descending select v; Vertex rating10Vertex = ratingsVertexEnum.First(); // Get the 20 best rated profiles regardless of gender var top = from u in userType.GetVertices() let edgeCt = u.GetNumberOfEdges(ratingEdgeType, rating10Vertex, Direction.Out) orderby edgeCt descending select new { u, edgeCt }; Console.WriteLine("20 best rated profiles regardless of gender"); ct = 0; foreach (var v in top) { if (++ct > 20) { break; } Console.WriteLine("User id: " + v.u.VertexId + "\t10 ratings: " + v.edgeCt); } Console.WriteLine(); // Get the 20 best rated males Console.WriteLine("20 best rated male profiles"); var top20males = from u in userType.GetVertices() where ((Gender)u.GetProperty(genderType)) == Gender.Male let edgeCt = u.GetNumberOfEdges(ratingEdgeType, rating10Vertex, Direction.Out) orderby edgeCt descending select new { u, edgeCt }; ct = 0; foreach (var v in top20males) { if (++ct > 20) { break; } Console.WriteLine("Male User id: " + v.u.VertexId + " \t10 ratings: " + v.edgeCt); } Console.WriteLine(); // Get the 20 best rated females Console.WriteLine("20 best rated female profiles"); var top20females = from u in userType.GetVertices() where ((Gender)u.GetProperty(genderType)) == Gender.Female let edgeCt = u.GetNumberOfEdges(ratingEdgeType, rating10Vertex, Direction.Out) orderby edgeCt descending select new { u, edgeCt }; ct = 0; foreach (var v in top20females) { if (++ct > 20) { break; } Console.WriteLine("Female User id: " + v.u.VertexId + "\t10 ratings: " + v.edgeCt); } session.Commit(); } }
static readonly string s_systemDir = "SupplierTracking"; // appended to SessionBase.BaseDatabasePath static int Main(string[] args) { DataCache.MaximumMemoryUse = 10000000000; // 10 GB, set this to what fits your case SupplierTracking supplierTracking = new SupplierTracking(); using (SessionNoServer session = new SessionNoServer(s_systemDir, 5000, false, true)) { if (Directory.Exists(session.SystemDirectory)) { Directory.Delete(session.SystemDirectory, true); // remove systemDir from prior runs and all its databases. } Directory.CreateDirectory(session.SystemDirectory); session.BeginUpdate(); Graph g = new Graph(session, false); // SCHEMA VertexType warehouseVertexType = g.NewVertexType("Warehouse"); VertexType supplierVertexType = g.NewVertexType("Supplier"); EdgeType supplierWarehouseEdgeType = g.NewEdgeType("Warehouse", true, supplierVertexType, warehouseVertexType); EdgeType moveToS1EdgeType = g.NewEdgeType("MoveS1To", true, warehouseVertexType, warehouseVertexType); EdgeType moveToS2EdgeType = g.NewEdgeType("MoveS2To", true, warehouseVertexType, warehouseVertexType); EdgeType moveToS3EdgeType = g.NewEdgeType("MoveS3To", true, warehouseVertexType, warehouseVertexType); PropertyType supplierNameProperty = supplierVertexType.NewProperty("name", DataType.String, PropertyKind.NotIndexed); PropertyType wareHouseNameProperty = warehouseVertexType.NewProperty("name", DataType.String, PropertyKind.NotIndexed); PropertyType howManyS1Property = moveToS1EdgeType.NewProperty("howMany", DataType.Integer, PropertyKind.NotIndexed); PropertyType howManyS2Property = moveToS2EdgeType.NewProperty("howMany", DataType.Integer, PropertyKind.NotIndexed); PropertyType howManyS3Property = moveToS3EdgeType.NewProperty("howMany", DataType.Integer, PropertyKind.NotIndexed); Vertex supplier1 = supplierVertexType.NewVertex(); supplier1.SetProperty(supplierNameProperty, "S1"); Vertex supplier2 = supplierVertexType.NewVertex(); supplier2.SetProperty(supplierNameProperty, "S2"); Vertex supplier3 = supplierVertexType.NewVertex(); supplier3.SetProperty(supplierNameProperty, "S3"); Vertex wareHouse1Supplier1 = warehouseVertexType.NewVertex(); supplier1.AddEdge(supplierWarehouseEdgeType, wareHouse1Supplier1); wareHouse1Supplier1.SetProperty(wareHouseNameProperty, "A01"); Vertex wareHouse2Supplier1 = warehouseVertexType.NewVertex(); supplier1.AddEdge(supplierWarehouseEdgeType, wareHouse2Supplier1); wareHouse2Supplier1.SetProperty(wareHouseNameProperty, "A02"); Vertex wareHouse3Supplier1 = warehouseVertexType.NewVertex(); supplier1.AddEdge(supplierWarehouseEdgeType, wareHouse3Supplier1); wareHouse3Supplier1.SetProperty(wareHouseNameProperty, "A05"); Vertex wareHouse4Supplier1 = warehouseVertexType.NewVertex(); supplier1.AddEdge(supplierWarehouseEdgeType, wareHouse4Supplier1); wareHouse4Supplier1.SetProperty(wareHouseNameProperty, "A06"); Vertex wareHouse1Supplier2 = warehouseVertexType.NewVertex(); supplier2.AddEdge(supplierWarehouseEdgeType, wareHouse1Supplier2); wareHouse1Supplier2.SetProperty(wareHouseNameProperty, "A03"); Vertex wareHouse2Supplier2 = warehouseVertexType.NewVertex(); supplier2.AddEdge(supplierWarehouseEdgeType, wareHouse2Supplier2); wareHouse2Supplier2.SetProperty(wareHouseNameProperty, "A07"); Vertex wareHouse1Supplier3 = warehouseVertexType.NewVertex(); supplier3.AddEdge(supplierWarehouseEdgeType, wareHouse1Supplier3); wareHouse1Supplier3.SetProperty(wareHouseNameProperty, "A04"); Vertex wareHouse2Supplier3 = warehouseVertexType.NewVertex(); supplier3.AddEdge(supplierWarehouseEdgeType, wareHouse2Supplier3); wareHouse2Supplier3.SetProperty(wareHouseNameProperty, "A08"); Vertex wareHouseB1 = warehouseVertexType.NewVertex(); wareHouseB1.SetProperty(wareHouseNameProperty, "B01"); Vertex wareHouseB2 = warehouseVertexType.NewVertex(); wareHouseB2.SetProperty(wareHouseNameProperty, "B02"); Vertex wareHouseB3 = warehouseVertexType.NewVertex(); wareHouseB3.SetProperty(wareHouseNameProperty, "B03"); Vertex wareHouseB4 = warehouseVertexType.NewVertex(); wareHouseB4.SetProperty(wareHouseNameProperty, "B04"); Vertex wareHouseC1 = warehouseVertexType.NewVertex(); wareHouseC1.SetProperty(wareHouseNameProperty, "C01"); Vertex wareHouseC2 = warehouseVertexType.NewVertex(); wareHouseC2.SetProperty(wareHouseNameProperty, "C02"); Vertex wareHouseD1 = warehouseVertexType.NewVertex(); wareHouseD1.SetProperty(wareHouseNameProperty, "D01"); Edge moveA1toB1 = wareHouse1Supplier1.AddEdge(moveToS1EdgeType, wareHouseB1); moveA1toB1.SetProperty(howManyS1Property, 750); Edge moveA2toB1 = wareHouse2Supplier1.AddEdge(moveToS1EdgeType, wareHouseB1); moveA2toB1.SetProperty(howManyS1Property, 500); Edge moveA3toB2 = wareHouse1Supplier2.AddEdge(moveToS2EdgeType, wareHouseB2); moveA3toB2.SetProperty(howManyS2Property, 750); Edge moveA4toB2 = wareHouse1Supplier3.AddEdge(moveToS3EdgeType, wareHouseB2); moveA4toB2.SetProperty(howManyS3Property, 500); Edge moveA5toB3 = wareHouse3Supplier1.AddEdge(moveToS1EdgeType, wareHouseB3); moveA5toB3.SetProperty(howManyS1Property, 100); Edge moveA6toB3 = wareHouse4Supplier1.AddEdge(moveToS1EdgeType, wareHouseB3); moveA6toB3.SetProperty(howManyS1Property, 200); Edge moveA7toB4 = wareHouse2Supplier2.AddEdge(moveToS2EdgeType, wareHouseB4); moveA7toB4.SetProperty(howManyS2Property, 50); Edge moveA8toB4 = wareHouse2Supplier3.AddEdge(moveToS3EdgeType, wareHouseB4); moveA8toB4.SetProperty(howManyS3Property, 450); Edge moveB1toC1 = wareHouseB1.AddEdge(moveToS1EdgeType, wareHouseC1); moveB1toC1.SetProperty(howManyS1Property, 400); Edge moveS2B2toC1 = wareHouseB2.AddEdge(moveToS2EdgeType, wareHouseC1); moveS2B2toC1.SetProperty(howManyS2Property, 360); Edge moveS3B2toC1 = wareHouseB2.AddEdge(moveToS3EdgeType, wareHouseC1); moveS3B2toC1.SetProperty(howManyS3Property, 240); Edge moveS1B3toC2 = wareHouseB3.AddEdge(moveToS1EdgeType, wareHouseC2); moveS1B3toC2.SetProperty(howManyS1Property, 100); Edge moveS2B4toC2 = wareHouseB4.AddEdge(moveToS2EdgeType, wareHouseC2); moveS2B4toC2.SetProperty(howManyS2Property, 20); Edge moveS3B4toC2 = wareHouseB4.AddEdge(moveToS3EdgeType, wareHouseC2); moveS3B4toC2.SetProperty(howManyS3Property, 180); Edge moveS1C1toD1 = wareHouseC1.AddEdge(moveToS1EdgeType, wareHouseD1); moveS1C1toD1.SetProperty(howManyS1Property, 200); Edge moveS2C1toD1 = wareHouseC1.AddEdge(moveToS2EdgeType, wareHouseD1); moveS2C1toD1.SetProperty(howManyS2Property, 180); Edge moveS3C1toD1 = wareHouseC1.AddEdge(moveToS3EdgeType, wareHouseD1); moveS3C1toD1.SetProperty(howManyS3Property, 120); Edge moveS1C2toD1 = wareHouseC2.AddEdge(moveToS1EdgeType, wareHouseD1); moveS1C2toD1.SetProperty(howManyS1Property, 67); Edge moveS2C2toD1 = wareHouseC2.AddEdge(moveToS2EdgeType, wareHouseD1); moveS2C2toD1.SetProperty(howManyS2Property, 13); Edge moveS3C2toD1 = wareHouseC2.AddEdge(moveToS3EdgeType, wareHouseD1); moveS3C2toD1.SetProperty(howManyS3Property, 120); Console.WriteLine("Supplier 1 to Warehouse D total: " + supplierTracking.CalculateTotalTo(supplier1, supplierWarehouseEdgeType, moveToS1EdgeType, howManyS1Property, wareHouseD1)); Console.WriteLine("Supplier 2 to Warehouse D total: " + supplierTracking.CalculateTotalTo(supplier2, supplierWarehouseEdgeType, moveToS2EdgeType, howManyS2Property, wareHouseD1)); Console.WriteLine("Supplier 3 to Warehouse D total: " + supplierTracking.CalculateTotalTo(supplier3, supplierWarehouseEdgeType, moveToS3EdgeType, howManyS3Property, wareHouseD1)); VelocityGraph.GraphJsonSettings gs = new VelocityGraph.GraphJsonSettings(); gs.ClusterFuncProp = v => { string s = (string)v.GetProperty("name"); if (s == null) { return(0); } return(Convert.ToInt32(s.First())); }; gs.VertexTypeFuncProp = v => { Vertex vertex = v as Vertex; string s = (string)vertex.VertexType.TypeName; return(s); }; //g.ExportToGraphJson("c:/SupplierTrackingExportToGraphJson.json", gs); Graph g2 = new Graph(session); //g2.ImportGraphJson("c:/SupplierTrackingExportToGraphJson.json"); session.Commit(); return(0); } }
static readonly string systemDir = "QuickStartVelocityGraph"; // appended to SessionBase.BaseDatabasePath static void CreateGraph() { using (SessionNoServer session = new SessionNoServer(systemDir)) { if (Directory.Exists(session.SystemDirectory)) { Directory.Delete(session.SystemDirectory, true); // remove systemDir from prior runs and all its databases. } // Start an update transaction session.BeginUpdate(); Graph g = new Graph(session); session.Persist(g); // Add a node type for the movies, with a unique identifier and two indexed Propertys VertexType movieType = g.NewVertexType("Movie"); PropertyType movieTitleType = g.NewVertexProperty(movieType, "title", DataType.String, PropertyKind.Indexed); PropertyType movieYearType = g.NewVertexProperty(movieType, "year", DataType.Integer, PropertyKind.Indexed); // Add a node type for the actor VertexType actorType = g.NewVertexType("Actor"); PropertyType actorNameType = g.NewVertexProperty(actorType, "name", DataType.String, PropertyKind.Indexed); // Add a directed edge type with a Property for the cast of a movie EdgeType castType = g.NewEdgeType("ACTS_IN", false); PropertyType castCharacterType = g.NewEdgeProperty(castType, "role", DataType.String, PropertyKind.Indexed); // Add some Movies Vertex matrix1 = movieType.NewVertex(); matrix1.SetProperty(movieTitleType, "The Matrix"); matrix1.SetProperty(movieYearType, (int)1999); Vertex matrix2 = movieType.NewVertex(); matrix2.SetProperty(movieTitleType, "The Matrix Reloaded"); matrix2.SetProperty(movieYearType, (int)2003); Vertex matrix3 = movieType.NewVertex(); matrix3.SetProperty(movieTitleType, "The Matrix Revolutions"); matrix3.SetProperty(movieYearType, (int)2003); // Add some Actors Vertex keanu = actorType.NewVertex(); keanu.SetProperty(actorNameType, "Keanu Reeves"); Vertex laurence = actorType.NewVertex(); laurence.SetProperty(actorNameType, "Laurence Fishburne"); Vertex carrieanne = actorType.NewVertex(); carrieanne.SetProperty(actorNameType, "Carrie-Anne Moss"); // Add some edges Edge keanuAsNeo = castType.NewEdge(keanu, matrix1); keanuAsNeo.SetProperty(castCharacterType, "Neo"); keanuAsNeo = castType.NewEdge(keanu, matrix2); keanuAsNeo.SetProperty(castCharacterType, "Neo"); keanuAsNeo = castType.NewEdge(keanu, matrix3); keanuAsNeo.SetProperty(castCharacterType, "Neo"); Edge laurenceAsMorpheus = castType.NewEdge(laurence, matrix1); laurenceAsMorpheus.SetProperty(castCharacterType, "Morpheus"); laurenceAsMorpheus = castType.NewEdge(laurence, matrix2); laurenceAsMorpheus.SetProperty(castCharacterType, "Morpheus"); laurenceAsMorpheus = castType.NewEdge(laurence, matrix3); laurenceAsMorpheus.SetProperty(castCharacterType, "Morpheus"); Edge carrieanneAsTrinity = castType.NewEdge(carrieanne, matrix1); carrieanneAsTrinity.SetProperty(castCharacterType, "Trinity"); carrieanneAsTrinity = castType.NewEdge(carrieanne, matrix2); carrieanneAsTrinity.SetProperty(castCharacterType, "Trinity"); carrieanneAsTrinity = castType.NewEdge(carrieanne, matrix3); carrieanneAsTrinity.SetProperty(castCharacterType, "Trinity"); // Commit the transaction session.Commit(); } }
public void SandeepGraph(bool useServerSession) { bool dirExist = Directory.Exists(systemDir); try { if (Directory.Exists(systemDir)) { Directory.Delete(systemDir, true); // remove systemDir from prior runs and all its databases. } Directory.CreateDirectory(systemDir); File.Copy(licenseDbFile, Path.Combine(systemDir, "4.odb")); } catch { File.Copy(licenseDbFile, Path.Combine(systemDir, "4.odb")); } using (SessionBase session = useServerSession ? (SessionBase) new ServerClientSession(systemDir) : (SessionBase) new SessionNoServer(systemDir)) { session.BeginUpdate(); session.DefaultDatabaseLocation().CompressPages = PageInfo.compressionKind.None; Graph g = new Graph(session); session.Persist(g); // SCHEMA VertexType userType = g.NewVertexType("User"); // Add a node type for the movies, with a unique identifier and two indexed Propertys VertexType movieType = g.NewVertexType("MOVIE"); PropertyType movieTitleType = g.NewVertexProperty(movieType, "TITLE", DataType.String, PropertyKind.Indexed); PropertyType movieYearType = g.NewVertexProperty(movieType, "YEAR", DataType.Integer, PropertyKind.Indexed); PropertyType objectPropertyType = g.NewVertexProperty(movieType, "object", DataType.Object, PropertyKind.NotIndexed); PropertyType objectPropertyTypeIndexed = g.NewVertexProperty(movieType, "object2", DataType.IOptimizedPersistable, PropertyKind.Indexed); Vertex mVickyCB = movieType.NewVertex(); mVickyCB.SetProperty(movieTitleType, "Vicky Cristina Barcelona"); mVickyCB.SetProperty(movieYearType, (int)(2008)); OptimizedPersistable pObj = new OptimizedPersistable(); session.Persist(pObj); mVickyCB.SetProperty(objectPropertyType, pObj); pObj = new OptimizedPersistable(); session.Persist(pObj); mVickyCB.SetProperty(objectPropertyTypeIndexed, pObj); Vertex mMatsCB = movieType.NewVertex(); mMatsCB.SetProperty(movieTitleType, "Mats Cristina Barcelona"); mMatsCB.SetProperty(movieYearType, (int)(2008)); pObj = new OptimizedPersistable(); session.Persist(pObj); mMatsCB.SetProperty(objectPropertyType, pObj); session.Commit(); session.BeginUpdate(); try { mMatsCB.SetProperty(objectPropertyTypeIndexed, null); throw new UnexpectedException(); } catch (NullObjectException) { } mMatsCB.Remove(); session.Commit(); //session.Persist(g); //session.Commit(); } using (SessionBase session = useServerSession ? (SessionBase) new ServerClientSession(systemDir) : (SessionBase) new SessionNoServer(systemDir)) { session.BeginUpdate(); Graph g = Graph.Open(session); VertexType movieType = g.FindVertexType("MOVIE"); Assert.NotNull(movieType); } Task taskB = new Task(() => WatchUser()); taskB.Start(); Task taskA = new Task(() => CreateUser()); taskA.Start(); taskB.Wait(); taskA.Wait(); }
public void Create1Vertices(bool vertexIdSetPerVertexType) { DataCache.MaximumMemoryUse = 10000000000; // 10 GB bool dirExist = Directory.Exists(systemDir); try { if (Directory.Exists(systemDir)) { Directory.Delete(systemDir, true); // remove systemDir from prior runs and all its databases. } Directory.CreateDirectory(systemDir); File.Copy(licenseDbFile, Path.Combine(systemDir, "4.odb")); } catch { File.Copy(licenseDbFile, Path.Combine(systemDir, "4.odb")); } using (SessionNoServer session = new SessionNoServer(systemDir, 5000, false, true)) { session.BeginUpdate(); Graph g = new Graph(session, vertexIdSetPerVertexType); session.Persist(g); VertexType userType = g.NewVertexType("User"); VertexType otherType = g.NewVertexType("Other"); PropertyType userNamePropertyType = g.NewVertexProperty(userType, "NAME", DataType.String, PropertyKind.Indexed); VertexType powerUserType = g.NewVertexType("PowerUser", userType); EdgeType userFriendEdgeType = g.NewEdgeType("Friend", true, userType, userType); EdgeType userBestFriendEdgeType = g.NewEdgeType("Best Friend", true, userType, userType, userFriendEdgeType); EdgeType otherEdgeType = g.NewEdgeType("Other", true, userType, userType); PropertyType bestFriendPropertyType = g.NewEdgeProperty(userFriendEdgeType, "START", DataType.DateTime, PropertyKind.Indexed); Vertex kinga = userType.NewVertex(); Vertex robin = userType.NewVertex(); Vertex mats = powerUserType.NewVertex(); Vertex chiran = powerUserType.NewVertex(); Vertex other = otherType.NewVertex(); Edge bestFriend = kinga.AddEdge(userBestFriendEdgeType, robin); Edge otherEdge = kinga.AddEdge(otherEdgeType, robin); DateTime now = DateTime.Now; mats.SetProperty("Address", 1); bestFriend.SetProperty(bestFriendPropertyType, now); kinga.SetProperty(userNamePropertyType, "Kinga"); if (g.VertexIdSetPerType == false) { mats.SetProperty(userNamePropertyType, "Mats"); } else { try { mats.SetProperty(userNamePropertyType, "Mats"); Assert.Fail("Invalid property for VertexType not handled"); } catch (Exception) { } } try { other.SetProperty(userNamePropertyType, "Mats"); Assert.Fail("Invalid property for VertexType not handled"); } catch (Exception) { } try { otherEdge.SetProperty(bestFriendPropertyType, now); Assert.Fail("Invalid property for VertexType not handled"); } catch (Exception) { } Vertex findMats = userNamePropertyType.GetPropertyVertex("Mats", true); var list = userNamePropertyType.GetPropertyVertices("Mats", true).ToList(); //Edge findWhen = bestFriendPropertyType.GetPropertyEdge(now); //var list2 = bestFriendPropertyType.GetPropertyEdges(now); Console.WriteLine(findMats); // session.Commit(); // session.BeginRead(); PropertyType adressProperty = g.FindVertexProperty(powerUserType, "Address"); Vertex find1 = adressProperty.GetPropertyVertex(1, true); session.Abort(); /*session.BeginUpdate(); * g.Unpersist(session); * session.Commit(); * dirExist = Directory.Exists(systemDir); * try * { * if (Directory.Exists(systemDir)) * Directory.Delete(systemDir, true); // remove systemDir from prior runs and all its databases. * Directory.CreateDirectory(systemDir); * File.Copy(licenseDbFile, Path.Combine(systemDir, "4.odb")); * } * catch * { * File.Copy(licenseDbFile, Path.Combine(systemDir, "4.odb")); * }*/ } using (SessionNoServer session = new SessionNoServer(systemDir, 5000, false, true)) { session.BeginUpdate(); session.DefaultDatabaseLocation().CompressPages = PageInfo.compressionKind.None; Graph g = new Graph(session, vertexIdSetPerVertexType); session.Persist(g); Graph g2 = new Graph(session); session.Persist(g2); Graph g3 = new Graph(session); session.Persist(g3); UInt32 dbNum = session.DatabaseNumberOf(typeof(Graph)); Graph g4 = (Graph)session.Open(dbNum, 2, 1, true); // g4 == g Graph g5 = (Graph)session.Open(dbNum, 2, 2, true); // g5 == g2 Graph g6 = (Graph)session.Open(dbNum, 2, 3, true); // g6 == g3 for (int i = 4; i < 8; i++) { Graph gt = new Graph(session); session.Persist(gt); } Graph g7 = new Graph(session); Placement place = new Placement(dbNum, 15); session.Persist(place, g7); // SCHEMA VertexType userType = g.NewVertexType("User"); VertexType locationType = g.NewVertexType("Location"); VertexType aVertexType = g.NewVertexType("A"); VertexType bVertexType = g.NewVertexType("B"); VertexType cVertexType = g.NewVertexType("C"); EdgeType uEdge = g.NewEdgeType("unrestricted", true); Vertex aVertex = g.NewVertex(aVertexType); Vertex bVertex = g.NewVertex(bVertexType); Vertex cVertex = g.NewVertex(cVertexType); Edge abEdge = (Edge)aVertex.AddEdge("unrestricted", bVertex); Edge bcEdge = (Edge)aVertex.AddEdge("unrestricted", cVertex); Dictionary <Vertex, HashSet <Edge> > traverse = aVertex.Traverse(uEdge, Direction.Out); abEdge.Remove(); Dictionary <Vertex, HashSet <Edge> > traverse2 = aVertex.Traverse(uEdge, Direction.Out); EdgeType friendEdgeType = g.NewEdgeType("Friend", true, userType, userType); EdgeType userLocationEdgeType = g.NewEdgeType("UserLocation", true, userType, locationType); // DATA Random rand = new Random(5); for (int i = 0; i < numberOfUserVertices / 100; i++) { int vId = rand.Next(numberOfUserVertices); try { if (g.VertexIdSetPerType) { userType.GetVertex(vId); } else { g.GetVertex(vId); } try { userType.NewVertex(vId); Assert.Fail(); } catch (VertexAllreadyExistException) { } } catch (VertexDoesNotExistException) { userType.NewVertex(vId); userType.GetVertex(vId); } } for (int i = 0; i < numberOfUserVertices / 10000; i++) { int vId = rand.Next(numberOfUserVertices); try { Vertex v = userType.GetVertex(vId); v.SetProperty("test", 1); } catch (VertexDoesNotExistException) { } } for (int i = 0; i < numberOfUserVertices / 10000; i++) { int vId = rand.Next(numberOfUserVertices); try { Vertex v = userType.GetVertex(vId); userType.RemoveVertex(v); } catch (VertexDoesNotExistException) { } } foreach (Vertex v in userType.GetVertices().ToArray()) { userType.RemoveVertex(v); } Assert.AreEqual(0, userType.GetVertices().Count()); for (int i = 100000; i < numberOfUserVertices; i++) { userType.NewVertex(); } for (int i = 1; i < 100000; i++) { userType.NewVertex(); } for (int i = 1; i < numberOfLocationVertices; i++) { locationType.NewVertex(); } session.Commit(); session.BeginRead(); foreach (var x in session.AllObjects <BTreeSet <Range <VertexId> > >(false, true)) { Assert.True(x.ToDoBatchAddCount == 0); } foreach (var x in session.AllObjects <BTreeSet <EdgeType> >(false, true)) { Assert.True(x.ToDoBatchAddCount == 0); } foreach (var x in session.AllObjects <BTreeSet <EdgeIdVertexId> >(false, true)) { Assert.True(x.ToDoBatchAddCount == 0); } foreach (var x in session.AllObjects <BTreeMap <EdgeId, VelocityDbList <ElementId> > >(false, true)) { Assert.True(x.ToDoBatchAddCount == 0); } foreach (var x in session.AllObjects <BTreeMap <string, PropertyType> >(false, true)) { Assert.True(x.ToDoBatchAddCount == 0); } foreach (var x in session.AllObjects <BTreeMap <string, EdgeType> >(false, true)) { Assert.True(x.ToDoBatchAddCount == 0); } foreach (var x in session.AllObjects <BTreeMap <string, VertexType> >(false, true)) { Assert.True(x.ToDoBatchAddCount == 0); } foreach (var x in session.AllObjects <BTreeMap <VertexId, BTreeSet <EdgeIdVertexId> > >(false, true)) { Assert.True(x.ToDoBatchAddCount == 0); } foreach (var x in session.AllObjects <BTreeMap <VertexType, BTreeMap <VertexId, BTreeSet <EdgeIdVertexId> > > >(false, true)) { Assert.True(x.ToDoBatchAddCount == 0); } foreach (var x in session.AllObjects <BTreeMap <EdgeType, BTreeMap <VertexType, BTreeMap <VertexId, BTreeSet <EdgeIdVertexId> > > > >(false, true)) { Assert.True(x.ToDoBatchAddCount == 0); } session.Commit(); Validate(); } }
static readonly string s_systemDir = "VelocityGraphSample"; // appended to SessionBase.BaseDatabasePath static void Main(string[] args) { using (SessionNoServer session = new SessionNoServer(s_systemDir)) { if (Directory.Exists(session.SystemDirectory)) { Directory.Delete(session.SystemDirectory, true); // remove systemDir from prior runs and all its databases. } Directory.CreateDirectory(session.SystemDirectory); Console.WriteLine("Running with databases in directory: " + session.SystemDirectory); session.BeginUpdate(); Graph g = new Graph(session); session.Persist(g); // SCHEMA // Add a node type for the movies, with a unique identifier and two indexed Propertys VertexType movieType = g.NewVertexType("MOVIE"); PropertyType movieTitleType = g.NewVertexProperty(movieType, "TITLE", DataType.String, PropertyKind.Indexed); PropertyType movieYearType = g.NewVertexProperty(movieType, "YEAR", DataType.Integer, PropertyKind.Indexed); // Add a node type for the people, with a unique identifier and an indexed Property VertexType peopleType = g.NewVertexType("PEOPLE"); PropertyType peopleNameType = g.NewVertexProperty(peopleType, "NAME", DataType.String, PropertyKind.Indexed); // Add an undirected edge type with a Property for the cast of a movie EdgeType castType = g.NewEdgeType("CAST", false); PropertyType castCharacterType = g.NewEdgeProperty(castType, "CHARACTER", DataType.String, PropertyKind.Indexed); // Add a directed edge type restricted to go from people to movie for the director of a movie EdgeType directsType = g.NewEdgeType("DIRECTS", true, peopleType, movieType); // DATA // Add some MOVIE nodes Vertex mLostInTranslation = movieType.NewVertex(); mLostInTranslation.SetProperty(movieTitleType, "Lost in Translation"); mLostInTranslation.SetProperty(movieYearType, (int)2003); Vertex mVickyCB = movieType.NewVertex(); mVickyCB.SetProperty(movieTitleType, "Vicky Cristina Barcelona"); mVickyCB.SetProperty(movieYearType, (int)2008); Vertex mManhattan = movieType.NewVertex(); mManhattan.SetProperty(movieTitleType, "Manhattan"); mManhattan.SetProperty(movieYearType, (int)1979); // Add some PEOPLE nodes Vertex pScarlett = peopleType.NewVertex(); pScarlett.SetProperty(peopleNameType, "Scarlett Johansson"); Vertex pBill = peopleType.NewVertex(); pBill.SetProperty(peopleNameType, "Bill Murray"); Vertex pSofia = peopleType.NewVertex(); pSofia.SetProperty(peopleNameType, "Sofia Coppola"); Vertex pWoody = peopleType.NewVertex(); pWoody.SetProperty(peopleNameType, "Woody Allen"); Vertex pPenelope = peopleType.NewVertex(); pPenelope.SetProperty(peopleNameType, "Penélope Cruz"); Vertex pDiane = peopleType.NewVertex(); pDiane.SetProperty(peopleNameType, "Diane Keaton"); // Add some CAST edges Edge anEdge; anEdge = g.NewEdge(castType, mLostInTranslation, pScarlett); anEdge.SetProperty(castCharacterType, "Charlotte"); anEdge = g.NewEdge(castType, mLostInTranslation, pBill); anEdge.SetProperty(castCharacterType, "Bob Harris"); anEdge = g.NewEdge(castType, mVickyCB, pScarlett); anEdge.SetProperty(castCharacterType, "Cristina"); anEdge = g.NewEdge(castType, mVickyCB, pPenelope); anEdge.SetProperty(castCharacterType, "Maria Elena"); anEdge = g.NewEdge(castType, mManhattan, pDiane); anEdge.SetProperty(castCharacterType, "Mary"); anEdge = g.NewEdge(castType, mManhattan, pWoody); anEdge.SetProperty(castCharacterType, "Isaac"); // Add some DIRECTS edges anEdge = g.NewEdge(directsType, pSofia, mLostInTranslation); anEdge = g.NewEdge(directsType, pWoody, mVickyCB); anEdge = g.NewEdge(directsType, pWoody, mManhattan); // QUERIES // Get the movies directed by Woody Allen Dictionary <Vertex, HashSet <Edge> > directedByWoody = pWoody.Traverse(directsType, Direction.Out); // Get the cast of the movies directed by Woody Allen Dictionary <Vertex, HashSet <Edge> > castDirectedByWoody = g.Traverse(directedByWoody.Keys.ToArray(), castType, Direction.Both); // Get the movies directed by Sofia Coppola Dictionary <Vertex, HashSet <Edge> > directedBySofia = pSofia.Traverse(directsType, Direction.Out); // Get the cast of the movies directed by Sofia Coppola Dictionary <Vertex, HashSet <Edge> > castDirectedBySofia = g.Traverse(directedBySofia.Keys.ToArray(), castType, Direction.Both); // We want to know the people that acted in movies directed by Woody AND in movies directed by Sofia. IEnumerable <Vertex> castFromBoth = castDirectedByWoody.Keys.Intersect(castDirectedBySofia.Keys); // Say hello to the people found foreach (Vertex person in castFromBoth) { object value = person.GetProperty(peopleNameType); System.Console.WriteLine("Hello " + value); } var billM = g.Traverse(directedBySofia.Keys.ToArray(), castType, Direction.Both).Keys.Where(vertex => vertex.GetProperty(peopleNameType).Equals("Bill Murray")); // Say hello to Bill Murray foreach (Vertex person in billM) { object value = person.GetProperty(peopleNameType); System.Console.WriteLine("Hello " + value); } session.Commit(); } using (ServerClientSession session = new ServerClientSession(s_systemDir, System.Net.Dns.GetHostName())) { session.BeginRead(); Graph g = Graph.Open(session); VertexType movieType = g.FindVertexType("MOVIE"); PropertyType movieTitleProperty = g.FindVertexProperty(movieType, "TITLE"); Vertex obj = g.FindVertex(movieTitleProperty, "Manhattan"); session.Commit(); } }
/// <summary> /// Creates a new node instance. /// </summary> /// <param name="type">Node type identifier.</param> /// <returns>Unique OID of the new node instance.</returns> public Vertex NewVertex(VertexType vertexType) { return(vertexType.NewVertex()); }
public void ingestData() { if (Directory.Exists(Path.Combine(SessionBase.BaseDatabasePath, s_systemDir))) { Directory.Delete(Path.Combine(SessionBase.BaseDatabasePath, s_systemDir), true); // remove systemDir from prior runs and all its databases. } Directory.CreateDirectory(Path.Combine(SessionBase.BaseDatabasePath, s_systemDir)); File.Copy(s_licenseDbFile, Path.Combine(SessionBase.BaseDatabasePath, s_systemDir, "4.odb")); using (SessionNoServer session = new SessionNoServer(s_systemDir, 5000, false, true)) { session.BeginUpdate(); session.DefaultDatabaseLocation().CompressPages = PageInfo.compressionKind.LZ4; Graph g = new Graph(session); session.Persist(g); // SCHEMA VertexType userType = g.NewVertexType("User"); EdgeType friendEdgeType = g.NewEdgeType("Friend", true, userType, userType); PropertyType countryProperty = userType.NewProperty("country", DataType.String, PropertyKind.NotIndexed); PropertyType incomeProperty = userType.NewProperty("income", DataType.Long, PropertyKind.NotIndexed); PropertyType friendshipStartProperty = friendEdgeType.NewProperty("start", DataType.DateTime, PropertyKind.NotIndexed); // DATA int lineNumber = 0; long fiendsCt = 0; int stop = (int)Math.Pow(2, 26); // make sure to create enough of these for (int i = 1; i < stop; i++) { userType.NewVertex(); } session.Commit(); session.BeginUpdate(); foreach (string line in File.ReadLines(s_inputData)) { if (++lineNumber % 10000 == 0) { Console.WriteLine("Parsing user " + lineNumber + ", friends total: " + fiendsCt + " at " + DateTime.Now); } string[] fields = line.Split(' '); Vertex aUser = null; foreach (string s in fields) { if (s.Length > 0) { if (aUser == null) { aUser = new Vertex(g, userType, int.Parse(s)); } else { ++fiendsCt; Vertex aFriend = new Vertex(g, userType, int.Parse(s)); if (fiendsCt % 2 == 0) { aFriend.SetProperty(countryProperty, "Sweden"); // just some random stuff } else { aFriend.SetProperty(incomeProperty, fiendsCt); // just some random stuff } Edge edge = friendEdgeType.NewEdge(aUser, aFriend); if (fiendsCt % 2 == 0) { edge.SetProperty(friendshipStartProperty, DateTime.Now); } } } } if (DataCache.MaximumMemoryUse >= 27000000000) { if (lineNumber >= 120000) // remove this condition if you have time to wait a while... { break; } } else if (lineNumber >= 60000) { break; } } Console.WriteLine("Done importing " + lineNumber + " users with " + fiendsCt + " friends"); session.Commit(); } }