예제 #1
0
        //
        private static void PopulateAllProfessionNearestNeighbors(int n)
        {
            MongoClient    dbClient = new MongoClient(MongoStrings.CONNECTION);
            IMongoDatabase database = dbClient.GetDatabase(MongoStrings.GRAPH_DB);

            var edge_collection        = database.GetCollection <BsonDocument>("edges_professions");
            var destination_collection = database.GetCollection <BsonDocument>("nearest_neighbors_profession");

            var ForkReport = new ONETReport();

            ForkReport.MasterOccupationList = JSON_IO.Import_OccupationList(Helper.Publics.FILENAMES.OCCUPATIONS + ".txt");

            Console.WriteLine("Iterating Through Occupations...");

            foreach (Occupation o in ForkReport.MasterOccupationList)
            {
                Console.WriteLine("                                ..." + o.Name);
                var occupationFilterA = Builders <BsonDocument> .Filter.Eq("OccupationAName", o.Name);

                var targetAdjacenciesA = edge_collection.Find(occupationFilterA).ToList();

                var occupationFilterB = Builders <BsonDocument> .Filter.Eq("OccupationBName", o.Name);

                var targetAdjacenciesB = edge_collection.Find(occupationFilterB).ToList();

                var MasterAdjacencyList = new List <SimpleOccupationEdge>();

                //retrieve adjacencies from database
                foreach (var a in targetAdjacenciesA)
                {
                    MasterAdjacencyList.Add(BsonSerializer.Deserialize <SimpleOccupationEdge>(a));
                }
                foreach (var b in targetAdjacenciesB)
                {
                    MasterAdjacencyList.Add(BsonSerializer.Deserialize <SimpleOccupationEdge>(b));
                }


                ProfessionNearestNeighbors newNeighborList = new ProfessionNearestNeighbors(o.Name);

                //sort adjacencies
                foreach (AttributeType foo in Enum.GetValues(typeof(AttributeType)))
                {
                    if (foo == AttributeType.Word2VecWIKI || foo == AttributeType.Skill || foo == AttributeType.Net || foo == AttributeType.Knowledge || foo == AttributeType.Ability)
                    {
                        List <SimpleOccupationEdge> SortedAdjacencyList = MasterAdjacencyList.OrderBy(oy => oy.getDistance(foo)).ToList();
                        var newList = SortedAdjacencyList.Take(n).Select(c => c.getOtherName(o.Name)).ToList();

                        newNeighborList.NearestNeighbors.Add(new Tuple <AttributeType, List <string> >(foo, newList));
                    }
                }

                destination_collection.InsertOne(newNeighborList.ToBsonDocument());
            }
        }
예제 #2
0
        //ETL the ONET data from origial ONET dowloadable db format to MongoDB
        private static void ONET_ETL_NoProfession()
        {
            var ForkReport = new ONETReport();

            ForkReport.MasterOccupationList = JSON_IO.Import_OccupationList(Helper.Publics.FILENAMES.OCCUPATIONS + ".txt");
            ForkReport.MasterSkillList      = JSON_IO.Import_AttributeList(Helper.Publics.FILENAMES.SKILLS + ".txt");
            ForkReport.MasterAbilityList    = JSON_IO.Import_AttributeList(Helper.Publics.FILENAMES.ABILITIES + ".txt");
            ForkReport.MasterKnowledgeList  = JSON_IO.Import_AttributeList(Helper.Publics.FILENAMES.KNOWLEDGE + ".txt");

            MongoClient    dbClient           = new MongoClient(MongoStrings.CONNECTION);
            IMongoDatabase database           = dbClient.GetDatabase(MongoStrings.GRAPH_DB);
            var            skill_collection   = database.GetCollection <BsonDocument>("node_skill");
            var            ability_collection = database.GetCollection <BsonDocument>("node_ability");
            // var profession_collection = database.GetCollection<BsonDocument>("node_profession");
            var knowledge_collection = database.GetCollection <BsonDocument>("node_knowledge");

            //add those top 5 occupations



            //save to DB
            var EmpInfoArray = new List <BsonDocument>();

            foreach (Attribute j in ForkReport.MasterSkillList)
            {
                EmpInfoArray.Add(j.ToBsonDocument());
            }
            skill_collection.InsertMany(EmpInfoArray);

            EmpInfoArray = new List <BsonDocument>();

            foreach (Attribute j in ForkReport.MasterKnowledgeList)
            {
                EmpInfoArray.Add(j.ToBsonDocument());
            }
            knowledge_collection.InsertMany(EmpInfoArray);

            EmpInfoArray = new List <BsonDocument>();

            foreach (Attribute j in ForkReport.MasterAbilityList)
            {
                EmpInfoArray.Add(j.ToBsonDocument());
            }
            ability_collection.InsertMany(EmpInfoArray);

            //EmpInfoArray = new List<BsonDocument>();

            /*foreach (Occupation j in ForkReport.MasterOccupationList)
             * {
             *  EmpInfoArray.Add(j.ToBsonDocument());
             * }
             * profession_collection.InsertMany(EmpInfoArray);
             */
        }
예제 #3
0
파일: NetworkHTML.cs 프로젝트: samodle/Jobs
        public static void writeGraphHTML_Demo(ONETReport forkReport, string FileName, string FileType = ".html")
        {
            string a        = "";
            Random random   = new Random();
            string fileName = Helper.Publics.FILEPATHS.PATH_FORK_HTML + FileName + FileType;

            FileStream fcreate = File.Open(fileName, FileMode.Create);

            using (StreamWriter writer = new StreamWriter(fcreate))
            {
                writer.WriteLine("<!DOCTYPE html>");
                writer.WriteLine("<meta charset = " + quote + "utf-8" + quote + ">");
                writer.WriteLine("<svg width = " + quote + "100%" + quote + " height = " + quote + "100%" + quote + "></svg>");
                writer.WriteLine("<script src = " + quote + "https://d3js.org/d3.v4.min.js" + quote + "></script>");
                writer.WriteLine("<script>");
                writer.WriteLine("var baseNodes = [");

                for (int i = 0; i < forkReport.MasterOccupationList.Count - 1; i++)
                {
                    writer.WriteLine("{id: " + quote + forkReport.MasterOccupationList[i].Name.Replace(" ", "") + quote + ", group: 0, label: " + quote + forkReport.MasterOccupationList[i].Name + quote + ", level: 1},");
                }
                int j = forkReport.MasterOccupationList.Count - 1;
                writer.WriteLine("{id: " + quote + forkReport.MasterOccupationList[j].Name.Replace(" ", "") + quote + ", group: 0, label: " + quote + forkReport.MasterOccupationList[j].Name + quote + ", level: 1}");

                /*
                 * writer.WriteLine("{id: " + quote + "mammal" + quote + ", group: 0, label: " + quote + "Mammals" + quote + ", level: 1},");
                 * writer.WriteLine("{id: " + quote + "dog" + quote + "   , group: 0, label: " + quote + "Dogs" + quote + "   , level: 2},");
                 * writer.WriteLine("{id: " + quote + "cat" + quote + "   , group: 0, label: " + quote + "Cats" + quote + "   , level: 2},");
                 * writer.WriteLine("{id: " + quote + "fox" + quote + "   , group: 0, label: " + quote + "Foxes" + quote + "  , level: 2},");
                 * writer.WriteLine("{id: " + quote + "elk" + quote + "   , group: 0, label: " + quote + "Elk" + quote + "    , level: 2},");
                 * writer.WriteLine("{id: " + quote + "insect" + quote + ", group: 1, label: " + quote + "Insects" + quote + ", level: 1},");
                 * writer.WriteLine("{id: " + quote + "ant" + quote + "   , group: 1, label: " + quote + "Ants" + quote + "   , level: 2},");
                 * writer.WriteLine("{id: " + quote + "bee" + quote + "   , group: 1, label: " + quote + "Bees" + quote + "   , level: 2},");
                 * writer.WriteLine("{id: " + quote + "fish" + quote + "  , group: 2, label: " + quote + "Fish" + quote + "   , level: 1},");
                 * writer.WriteLine("{id: " + quote + "carp" + quote + "  , group: 2, label: " + quote + "Carp" + quote + "   , level: 2},");
                 * writer.WriteLine("{id: " + quote + "pike" + quote + "  , group: 2, label: " + quote + "Pikes" + quote + "  , level: 2}");
                 */
                writer.WriteLine("]");
                writer.WriteLine("var baseLinks = [");
                for (int i = 0; i < forkReport.MasterOccupationList.Count - 1; i++)
                {
                    if (i < forkReport.MasterOccupationList.Count / 2)
                    {
                        writer.WriteLine("{target: " + quote + forkReport.MasterOccupationList[i + 1].Name.Replace(" ", "") + quote + ", source: " + quote + forkReport.MasterOccupationList[i].Name.Replace(" ", "") + quote + " , strength: " + random.NextDouble() + "},");
                        writer.WriteLine("{target: " + quote + forkReport.MasterOccupationList[i + 2].Name.Replace(" ", "") + quote + ", source: " + quote + forkReport.MasterOccupationList[i].Name.Replace(" ", "") + quote + " , strength: " + random.NextDouble() + "},");
                    }
                    else
                    {
                        writer.WriteLine("{target: " + quote + forkReport.MasterOccupationList[i - 1].Name.Replace(" ", "") + quote + ", source: " + quote + forkReport.MasterOccupationList[i].Name.Replace(" ", "") + quote + " , strength: " + random.NextDouble() + "},");
                        writer.WriteLine("{target: " + quote + forkReport.MasterOccupationList[i - 2].Name.Replace(" ", "") + quote + ", source: " + quote + forkReport.MasterOccupationList[i].Name.Replace(" ", "") + quote + " , strength: " + random.NextDouble() + "},");
                    }
                }
                writer.WriteLine("{target: " + quote + forkReport.MasterOccupationList[j - 1].Name.Replace(" ", "") + quote + ", source: " + quote + forkReport.MasterOccupationList[j].Name.Replace(" ", "") + quote + " , strength: " + random.NextDouble() + "}");

                /*
                 * writer.WriteLine("{target: " + quote + "mammal" + quote + ", source: " + quote + "dog" + quote + " , strength: 0.7},");
                 * writer.WriteLine("	{target: " + quote + "mammal" + quote + ", source: " + quote + "cat" + quote + " , strength: 0.7},");
                 * writer.WriteLine("{target: " + quote + "mammal" + quote + ", source: " + quote + "fox" + quote + " , strength: 0.7},");
                 * writer.WriteLine("{target: " + quote + "mammal" + quote + ", source: " + quote + "elk" + quote + " , strength: 0.7},");
                 * writer.WriteLine("{target: " + quote + "insect" + quote + ", source: " + quote + "ant" + quote + " , strength: 0.7},");
                 * writer.WriteLine("{target: " + quote + "insect" + quote + ", source: " + quote + "bee" + quote + " , strength: 0.7},");
                 * writer.WriteLine("{target: " + quote + "fish" + quote + "  , source: " + quote + "carp" + quote + ", strength: 0.7},");
                 * writer.WriteLine("{target: " + quote + "fish" + quote + "  , source: " + quote + "pike" + quote + ", strength: 0.7},");
                 * writer.WriteLine("{target: " + quote + "cat" + quote + "   , source: " + quote + "elk" + quote + " , strength: 0.1},");
                 * writer.WriteLine("{target: " + quote + "carp" + quote + "  , source: " + quote + "ant" + quote + " , strength: 0.1},");
                 * writer.WriteLine("{target: " + quote + "elk" + quote + "   , source: " + quote + "bee" + quote + " , strength: 0.1},");
                 * writer.WriteLine("{target: " + quote + "dog" + quote + "   , source: " + quote + "cat" + quote + " , strength: 0.1},");
                 * writer.WriteLine("{target: " + quote + "fox" + quote + "   , source: " + quote + "ant" + quote + " , strength: 0.1},");
                 * writer.WriteLine("	{target: " + quote + "pike" + quote + "  , source: " + quote + "cat" + quote + " , strength: 0.1}");
                 */

                writer.WriteLine("]");
                writer.WriteLine("var nodes = [...baseNodes]");
                writer.WriteLine("var links = [...baseLinks]");
                writer.WriteLine("function getNeighbors(node)");
                writer.WriteLine("{");
                writer.WriteLine("return baseLinks.reduce(function(neighbors, link) {");
                writer.WriteLine("if (link.target.id === node.id)");
                writer.WriteLine("{");
                writer.WriteLine("neighbors.push(link.source.id)");
                writer.WriteLine("}");
                writer.WriteLine("else if (link.source.id === node.id)");
                writer.WriteLine("{");
                writer.WriteLine("neighbors.push(link.target.id)");
                writer.WriteLine("}");
                writer.WriteLine("return neighbors");
                writer.WriteLine("},");
                writer.WriteLine("[node.id]");
                writer.WriteLine(")");
                writer.WriteLine("}");
                writer.WriteLine("function isNeighborLink(node, link)");
                writer.WriteLine("{");
                writer.WriteLine("return link.target.id === node.id || link.source.id === node.id");
                writer.WriteLine("}");
                writer.WriteLine("function getNodeColor(node, neighbors)");
                writer.WriteLine("{");
                writer.WriteLine("if (Array.isArray(neighbors) && neighbors.indexOf(node.id)> -1)");
                writer.WriteLine("{");
                writer.WriteLine("return node.level === 1 ? " + quote_single + "blue" + quote_single + " : " + quote_single + "green" + quote_single + "");
                writer.WriteLine("}");
                writer.WriteLine("return node.level === 1 ? " + quote_single + "red" + quote_single + " : " + quote_single + "gray" + quote_single + "");
                writer.WriteLine("}");
                writer.WriteLine("function getLinkColor(node, link)");
                writer.WriteLine("{");
                writer.WriteLine("return isNeighborLink(node, link) ? " + quote_single + "green" + quote_single + " : " + quote_single + "#E5E5E5" + quote_single + "");
                writer.WriteLine("}");
                writer.WriteLine("function getTextColor(node, neighbors)");
                writer.WriteLine("{");
                writer.WriteLine("return Array.isArray(neighbors) && neighbors.indexOf(node.id)> -1 ? " + quote_single + "green" + quote_single + " : " + quote_single + "black" + quote_single + "");
                writer.WriteLine("}");
                writer.WriteLine("var width = window.innerWidth");
                writer.WriteLine("var height = window.innerHeight");
                writer.WriteLine("var svg = d3.select(" + quote_single + "svg" + quote_single + ")");
                writer.WriteLine("svg.attr(" + quote_single + "width" + quote_single + ", width).attr(" + quote_single + "height" + quote_single + ", height)");
                writer.WriteLine("var linkElements,");
                writer.WriteLine("nodeElements,");
                writer.WriteLine("textElements");
                writer.WriteLine("var linkGroup = svg.append(" + quote_single + "g" + quote_single + ").attr(" + quote_single + "class" + quote_single + ", " + quote_single + "links" + quote_single + ")");
                writer.WriteLine("var nodeGroup = svg.append(" + quote_single + "g" + quote_single + ").attr(" + quote_single + "class" + quote_single + ", " + quote_single + "nodes" + quote_single + ")");
                writer.WriteLine("var textGroup = svg.append(" + quote_single + "g" + quote_single + ").attr(" + quote_single + "class" + quote_single + ", " + quote_single + "texts" + quote_single + ")");
                writer.WriteLine("var selectedId");
                writer.WriteLine("var linkForce = d3");
                writer.WriteLine(".forceLink()");
                writer.WriteLine(".id(function(link) {return link.id})");
                writer.WriteLine(".strength(function (link) {return link.strength})");
                writer.WriteLine("var simulation = d3");
                writer.WriteLine(".forceSimulation()");
                writer.WriteLine(".force(" + quote_single + "link" + quote_single + ", linkForce)");
                writer.WriteLine(".force(" + quote_single + "charge" + quote_single + ", d3.forceManyBody().strength(-120))");
                writer.WriteLine(".force(" + quote_single + "center" + quote_single + ", d3.forceCenter(width / 2, height / 2))");
                writer.WriteLine("var dragDrop = d3.drag().on(" + quote_single + "start" + quote_single + ", function(node) {");
                writer.WriteLine("node.fx = node.x");
                writer.WriteLine("node.fy = node.y");
                writer.WriteLine("}).on(" + quote_single + "drag" + quote_single + ", function (node) {");
                writer.WriteLine("simulation.alphaTarget(0.7).restart()");
                writer.WriteLine("node.fx = d3.event.x");
                writer.WriteLine("node.fy = d3.event.y");
                writer.WriteLine("}).on(" + quote_single + "end" + quote_single + ", function (node) {");
                writer.WriteLine("if (!d3.event.active) {");
                writer.WriteLine("simulation.alphaTarget(0)");
                writer.WriteLine("}");
                writer.WriteLine("node.fx = null");
                writer.WriteLine("node.fy = null");
                writer.WriteLine("})");
                writer.WriteLine("function selectNode(selectedNode)");
                writer.WriteLine("{");
                writer.WriteLine("if (selectedId === selectedNode.id)");
                writer.WriteLine("{");
                writer.WriteLine("selectedId = undefined");
                writer.WriteLine("resetData()");
                writer.WriteLine("updateSimulation()");
                writer.WriteLine("}");
                writer.WriteLine("else");
                writer.WriteLine("{");
                writer.WriteLine("selectedId = selectedNode.id");
                writer.WriteLine("updateData(selectedNode)");
                writer.WriteLine("updateSimulation()");
                writer.WriteLine("}");
                writer.WriteLine("var neighbors = getNeighbors(selectedNode)");
                writer.WriteLine("nodeElements.attr(" + quote_single + "fill" + quote_single + ", function(node) {return getNodeColor(node, neighbors)})");
                writer.WriteLine("textElements.attr(" + quote_single + "fill" + quote_single + ", function(node) {return getTextColor(node, neighbors)})");
                writer.WriteLine("linkElements.attr(" + quote_single + "stroke" + quote_single + ", function(link) {return getLinkColor(selectedNode, link)})");
                writer.WriteLine("}");
                writer.WriteLine("function resetData()");
                writer.WriteLine("{");
                writer.WriteLine("var nodeIds = nodes.map(function(node) {return node.id})");
                writer.WriteLine("baseNodes.forEach(function(node) {");
                writer.WriteLine("if (nodeIds.indexOf(node.id) === -1)");
                writer.WriteLine("{");
                writer.WriteLine("nodes.push(node)");
                writer.WriteLine("}");
                writer.WriteLine("})");
                writer.WriteLine("links = baseLinks");
                writer.WriteLine("}");
                writer.WriteLine("function updateData(selectedNode)");
                writer.WriteLine("{");
                writer.WriteLine("var neighbors = getNeighbors(selectedNode)");
                writer.WriteLine("var newNodes = baseNodes.filter(function(node) {");
                writer.WriteLine("return neighbors.indexOf(node.id)> -1 || node.level === 1");
                writer.WriteLine("})");
                writer.WriteLine("var diff = {");
                writer.WriteLine("removed: nodes.filter(function(node) {return newNodes.indexOf(node) === -1}),");
                writer.WriteLine("added: newNodes.filter(function(node) {return nodes.indexOf(node) === -1})");
                writer.WriteLine("}");
                writer.WriteLine("diff.removed.forEach(function (node) {nodes.splice(nodes.indexOf(node), 1)})");
                writer.WriteLine("diff.added.forEach(function (node) {nodes.push(node)})");
                writer.WriteLine("links = baseLinks.filter(function (link) {");
                writer.WriteLine("return link.target.id === selectedNode.id || link.source.id === selectedNode.id");
                writer.WriteLine("})");
                writer.WriteLine("}");
                writer.WriteLine("function updateGraph()");
                writer.WriteLine("{");
                writer.WriteLine("linkElements = linkGroup.selectAll(" + quote_single + "line" + quote_single + ")");
                writer.WriteLine(".data(links, function(link) {");
                writer.WriteLine("return link.target.id + link.source.id");
                writer.WriteLine("})");
                writer.WriteLine("linkElements.exit().remove()");
                writer.WriteLine("var linkEnter = linkElements");
                writer.WriteLine(".enter().append(" + quote_single + "line" + quote_single + ")");
                writer.WriteLine(".attr(" + quote_single + "stroke-width" + quote_single + ", 1)");
                writer.WriteLine(".attr(" + quote_single + "stroke" + quote_single + ", " + quote_single + "rgba(50, 50, 50, 0.2)" + quote_single + ")");
                writer.WriteLine("linkElements = linkEnter.merge(linkElements)");
                writer.WriteLine("nodeElements = nodeGroup.selectAll(" + quote_single + "circle" + quote_single + ")");
                writer.WriteLine(".data(nodes, function(node) {return node.id})");
                writer.WriteLine("nodeElements.exit().remove()");
                writer.WriteLine("var nodeEnter = nodeElements");
                writer.WriteLine(".enter()");
                writer.WriteLine(".append(" + quote_single + "circle" + quote_single + ")");
                writer.WriteLine(".attr(" + quote_single + "r" + quote_single + ", 10)");
                writer.WriteLine(".attr(" + quote_single + "fill" + quote_single + ", function(node) {return node.level === 1 ? " + quote_single + "red" + quote_single + " : " + quote_single + "gray" + quote_single + "})");
                writer.WriteLine(".call(dragDrop)");
                writer.WriteLine(".on(" + quote_single + "click" + quote_single + ", selectNode)");
                writer.WriteLine("nodeElements = nodeEnter.merge(nodeElements)");
                writer.WriteLine("textElements = textGroup.selectAll(" + quote_single + "text" + quote_single + ")");
                writer.WriteLine(".data(nodes, function(node) {return node.id})");
                writer.WriteLine("textElements.exit().remove()");
                writer.WriteLine("var textEnter = textElements");
                writer.WriteLine(".enter()");
                writer.WriteLine(".append(" + quote_single + "text" + quote_single + ")");
                writer.WriteLine(".text(function(node) {return node.label})");
                writer.WriteLine(".attr(" + quote_single + "font-size" + quote_single + ", 15)");
                writer.WriteLine(".attr(" + quote_single + "dx" + quote_single + ", 15)");
                writer.WriteLine(".attr(" + quote_single + "dy" + quote_single + ", 4)");
                writer.WriteLine("textElements = textEnter.merge(textElements)");
                writer.WriteLine("}");
                writer.WriteLine("function updateSimulation()");
                writer.WriteLine("{");
                writer.WriteLine("updateGraph()");
                writer.WriteLine("simulation.nodes(nodes).on(" + quote_single + "tick" + quote_single + ", () => {");
                writer.WriteLine("nodeElements");
                writer.WriteLine(".attr(" + quote_single + "cx" + quote_single + ", function(node) {return node.x})");
                writer.WriteLine(".attr(" + quote_single + "cy" + quote_single + ", function(node) {return node.y})");
                writer.WriteLine("textElements");
                writer.WriteLine(".attr(" + quote_single + "x" + quote_single + ", function(node) {return node.x})");
                writer.WriteLine(".attr(" + quote_single + "y" + quote_single + ", function(node) {return node.y})");
                writer.WriteLine("linkElements");
                writer.WriteLine(".attr(" + quote_single + "x1" + quote_single + ", function(link) {return link.source.x})");
                writer.WriteLine(".attr(" + quote_single + "y1" + quote_single + ", function(link) {return link.source.y})");
                writer.WriteLine(".attr(" + quote_single + "x2" + quote_single + ", function(link) {return link.target.x})");
                writer.WriteLine(".attr(" + quote_single + "y2" + quote_single + ", function(link) {return link.target.y})");
                writer.WriteLine("})");
                writer.WriteLine("simulation.force(" + quote_single + "link" + quote_single + ").links(links)");
                writer.WriteLine("simulation.alphaTarget(0.7).restart()");
                writer.WriteLine("}");
                writer.WriteLine("updateSimulation()");
                writer.WriteLine("</script>");

                writer.Close();
            }
        }
예제 #4
0
        //ETL the profession info, add top adjacencies to profession node (this part is bad and needs to go)
        private static void ONET_ETL_Profession()
        {
            var ForkReport = new ONETReport();

            ForkReport.MasterOccupationList = JSON_IO.Import_OccupationList(Helper.Publics.FILENAMES.OCCUPATIONS + ".txt");
            ForkReport.MasterSkillList      = JSON_IO.Import_AttributeList(Helper.Publics.FILENAMES.SKILLS + ".txt");
            ForkReport.MasterAbilityList    = JSON_IO.Import_AttributeList(Helper.Publics.FILENAMES.ABILITIES + ".txt");
            ForkReport.MasterKnowledgeList  = JSON_IO.Import_AttributeList(Helper.Publics.FILENAMES.KNOWLEDGE + ".txt");

            MongoClient    dbClient = new MongoClient(MongoStrings.CONNECTION);
            IMongoDatabase database = dbClient.GetDatabase(MongoStrings.GRAPH_DB);

            var profession_collection = database.GetCollection <BsonDocument>("node_profession");

            //add those top 5 occupations



            var collection = database.GetCollection <BsonDocument>("edges_professions");

            foreach (Occupation o in ForkReport.MasterOccupationList)
            {
                //   var occupationFilter = Builders<BsonDocument>.Filter.ElemMatch<BsonValue>(
                //     "OccupationAName",
                //
                //   );
                var occupationFilterA = Builders <BsonDocument> .Filter.Eq("OccupationAName", o.Name);

                var targetAdjacenciesA = collection.Find(occupationFilterA).ToList();

                var occupationFilterB = Builders <BsonDocument> .Filter.Eq("OccupationBName", o.Name);

                var targetAdjacenciesB = collection.Find(occupationFilterB).ToList();

                var MasterAdjacencyList = new List <SimpleOccupationEdge>();

                //retrieve adjacencies from database
                foreach (var a in targetAdjacenciesA)
                {
                    MasterAdjacencyList.Add(BsonSerializer.Deserialize <SimpleOccupationEdge>(a));
                }
                foreach (var b in targetAdjacenciesB)
                {
                    MasterAdjacencyList.Add(BsonSerializer.Deserialize <SimpleOccupationEdge>(b));
                }

                //sort adjacencies
                List <SimpleOccupationEdge> SortedAdjacencyList = MasterAdjacencyList.OrderBy(oy => oy.getDistance()).ToList();


                //save top adjacencies
                //REMOVING - NOT HOW WE ARE MANAGING THIS INFO
                //o.TenMostAdjacent = SortedAdjacencyList.Take(10).Select(c => c.getOtherName(o.Name)).ToList();
            }



            //save to DB
            var EmpInfoArray = new List <BsonDocument>();

            foreach (Occupation j in ForkReport.MasterOccupationList)
            {
                EmpInfoArray.Add(j.ToBsonDocument());
            }
            profession_collection.InsertMany(EmpInfoArray);
        }