Skip to content

Instantly share code, notes, and snippets.

@wey-gu
Last active May 29, 2022 09:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wey-gu/53e35bc2da571a919f4f0c248c5dd9fc to your computer and use it in GitHub Desktop.
Save wey-gu/53e35bc2da571a919f4f0c248c5dd9fc to your computer and use it in GitHub Desktop.
demo node2vec nebula algorithm

Let's setup Nebula Graph with a graph, Spark, Hadoop, run Nebula Algoritm Node2vec to read Graph from Nebula and Sink result data into a file.

Table of contents generated with markdown-toc

Bootstrap a test nebula graph cluster

# ref: https://www.siwei.io/spark-on-nebula-graph/#bootstrap-a-nebula-graph-cluster
# bootstrap nebula in docker
curl -fsSL nebula-up.siwei.io/install.sh | bash

# enter console container
~/.nebula-up/console.sh
# connect with console
nebula-console -addr graphd -port 9669 -user root -p nebula

# RUN ADD HOSTS for the first time of cluster boot
ADD HOSTS "storaged0":9779,"storaged1":9779,"storaged2":9779;
SHOW HOSTS;

# Load data from nba_int_vid.ngql now

Note refer to #appendix on nba_int_vid.ngql

Run a spark in container

docker run --name spark-master-0 --network nebula-net \
    -h spark-master-0 -e ENABLE_INIT_DAEMON=false -d \
    -v ${PWD}/:/root \
    bde2020/spark-master:2.4.5-hadoop2.7

Setup a hdfs in container

First, Make nebula graph with external network

docker network create nebula-net
cd ~/.nebula-up/nebula-docker-compose
echo '    external: true' >> docker-compose.yaml
docker-compose up -d

Then create a hadoop cluster

git clone https://github.com/big-data-europe/docker-hadoop.git
cd docker-hadoop
vi docker-compose.yml # refer to https://siwei.io/nebula-exchange-sst-2.x/#%E9%99%84%E5%BD%95%E4%BA%8C
docker-compose up -d

Enter the spark container:

docker exec -it spark-master-0 bash

Download and run Nebula-algorithm

Note, algo-node2vec.conf in #appendix

$ wget https://repo1.maven.org/maven2/com/vesoft/nebula-algorithm/3.0.0/nebula-algorithm-3.0.0.jar

$ vi algo-node2vec.conf

$ /spark/bin/spark-submit --master "local" --conf spark.rpc.askTimeout=6000s \
    --class com.vesoft.nebula.algorithm.Main \
    --driver-memory 16g nebula-algorithm-3.0.0.jar \
    -p algo-node2vec.conf

Then we could see its exectuion log like:

...
22/05/29 08:54:48 INFO FileOutputCommitter: Saved output of task 'attempt_20220529085447_0773_m_000000_874' to file:/tmp/count/_temporary/0/task_20220529085447_0773_m_000000
...

The result

cat /tmp/part*.csv

Then we could see the node's id and their vectors in dim-10(as configured) like:

_id,node2vec
200225,"0.2686649,-0.78878,-0.08228644,-1.0986156,1.3357894,-0.7996224,0.29855245,-1.0813422,0.19613224,0.7787796"
100142,"0.5266678,0.7960458,-0.429912,0.9645613,0.37226734,-0.12659578,0.10594095,-0.5118794,1.0593011,-0.9204883"
100148,"1.0806257,-0.5904553,-0.26999772,0.16419524,1.1921446,-0.08229711,0.12157571,0.9558036,-0.5917193,0.33506033"
100137,"0.4314661,-0.074324325,-0.9310845,0.5113405,1.6010454,0.55436915,0.08353233,-0.15874566,-0.6140558,-0.24417387"
100131,"0.090718634,0.5037965,0.6522655,-0.71508527,-0.84837997,-1.0407721,-0.19930698,0.97869813,0.56460476,-1.0929388"
200221,"-0.574381,-0.7003567,0.20355815,0.4580731,0.23610723,0.07307358,1.0973347,-0.8181865,0.052643325,0.35232273"
200210,"-0.12355657,-0.9487031,-0.387931,-0.28063616,-0.141058,0.16902333,1.2149646,-0.270761,0.16957639,0.5696083"
100115,"-0.06987826,-0.80779773,-0.111460805,-0.51768273,0.116356745,0.49113035,0.8902055,-0.22335617,-0.08027313,-0.24004172"
200224,"-0.5423228,0.36741927,-0.06432473,0.27175996,0.033388253,0.5931023,-0.2032804,-0.24338022,-0.63097376,0.93902797"
100126,"-0.54415107,-0.6484865,0.6360586,-0.5011326,-0.6729498,0.47032994,1.0659043,0.66132534,-0.051124614,0.5626554"
200213,"0.4835857,-0.13583654,-0.8750291,-0.19207974,1.7149982,0.2585501,0.07917577,0.16807698,-0.69832355,-0.14173512"
100104,"-0.5247228,0.16522326,-0.2618903,1.0631732,-0.42084122,0.31725198,-0.25306636,-0.48781642,0.06094546,-0.775345"
100120,"-0.19023408,0.74337715,0.1764587,-1.4299762,0.5722786,0.15240836,-0.16486993,1.241895,0.22848101,-0.99167573"
200202,"-0.3990182,0.7709684,0.45385113,-1.6083239,0.26244113,0.8349309,-0.74315256,1.4561766,-0.054712873,-0.54497737"
100129,"-0.6768973,-0.34949058,0.04998856,-0.20371142,-0.06389409,0.64604473,1.7225673,0.2658711,-0.014346281,0.53854555"
100118,"0.19234763,0.56590724,0.010852328,-0.71923673,0.27116695,-0.061676413,0.2230623,0.87207556,0.4784007,-0.87158585"
100108,"-0.06730684,-0.24883045,0.18359657,-0.27218908,-0.5484636,0.704559,-0.5706034,-0.20392403,0.20337796,0.6555931"
200216,"-0.9570796,-0.29094166,0.6551656,-0.06123199,-0.71068776,0.06867638,1.908751,0.3512583,-0.057183716,0.45199147"
100103,"-1.7439371,-0.4709487,0.5489105,0.6603995,0.012422398,-0.42883816,-0.4156207,-0.6188131,0.71770585,-0.4832078"
200227,"0.5930517,-0.2827085,-0.42618397,0.1643649,0.44161704,0.038884737,-0.32618478,0.2836763,-0.8152101,0.1483705"
200205,"0.30127528,0.18365362,0.3803142,-0.72501355,0.42257327,0.50490445,0.055239696,1.3786098,0.31744096,-1.3033563"
200211,"0.23390815,-0.18496335,-0.5410124,0.34690017,1.0268397,0.34686965,1.2103796,-0.8897811,0.49785942,0.14894965"
100114,"-1.1225548,-0.11692312,0.7508727,-0.2845833,-0.41055807,-0.096583344,-0.6018837,-0.055642657,0.11269726,0.0018496249"
200212,"-1.442272,-1.0904273,0.2947792,-0.1416494,0.38849828,-0.26283032,0.14132635,-1.063651,0.10971328,0.2777401"
100143,"0.43171966,-0.19024979,-0.71268684,0.26522452,1.7337601,0.6069273,-0.22990331,0.78001773,-0.8751516,0.053790733"
100125,"-0.36645925,-0.5022292,0.42270112,0.36261654,-0.6534087,-0.5531196,-0.0117684305,-0.77430934,0.17315769,-0.14540271"
100136,"0.78606343,-0.61101794,-0.5193606,-0.1829641,0.5876465,0.23852196,0.40599588,-0.029122591,-0.34928307,0.080626175"
100119,"0.546008,1.072073,-0.2402007,0.07882133,0.4946244,0.033343114,0.16089141,0.5029594,0.9394153,-1.2611916"
100132,"0.25721803,-0.8787908,-0.28476298,-0.92802715,1.3381633,-0.17703664,-0.08561368,-1.4213675,-0.2927471,0.9521081"
100107,"-0.65726006,0.27690357,-0.022551918,0.26145238,-0.15709768,0.38052282,0.7179081,-0.19642146,0.15654121,0.2261322"
100147,"0.41276732,-0.4468867,-0.24714246,-0.30680296,0.47863427,0.074981764,0.61937064,0.62574786,-0.5949322,0.716829"
100110,"-0.63673466,0.1275803,0.91852844,0.19151865,-0.8096119,-0.958194,-0.7012797,0.19174291,0.22239247,-0.5500218"
200218,"-1.2243706,0.20948134,0.66987383,0.14878628,-0.8630949,-0.36169684,-1.4290587,-0.69641,0.6199899,-0.08471454"
200201,"0.19664808,0.14594525,0.16386317,-1.2407435,0.7999363,0.6868396,-0.008888845,1.3171402,0.12181151,-0.055573493"
100150,"0.27258942,-0.1838883,-0.85881317,0.22865096,1.821845,0.74879706,-0.23373601,-0.05399299,-0.8002761,-0.02425505"
100121,"-0.30124995,0.93936855,-0.055274416,-0.61573726,-0.3560351,0.17979375,-1.0472367,0.971085,-0.22867581,0.3589804"
200200,"-0.080104314,0.8561123,-0.27364013,0.7188644,0.24114339,0.29068565,-1.1178669,-0.20151734,1.0348293,-1.3464642"
200207,"-0.58004624,0.8211702,-0.26788342,-0.044768214,0.47751713,0.38633403,-0.26535282,1.1979254,-1.0057205,1.6574605"
200222,"0.1452051,0.3711844,-1.019829,1.2462405,-0.33220384,-0.034770567,-0.7525977,-0.0072494033,-0.63516027,-0.9028053"
100109,"-0.028301962,-0.2916175,-0.082961775,0.711541,-0.8645969,-0.18619454,-0.6776572,-0.45699772,-0.56108147,-0.94806546"
200223,"0.56216407,-0.29331097,-0.5428883,-0.38077244,1.1695807,-0.06601254,-0.08533181,1.1108707,-1.080903,0.09588741"
200229,"0.30325893,-0.38264367,-0.15102811,-0.38601995,-0.76177835,0.17479284,1.5835212,0.66204834,-0.39616615,-0.14587206"
100146,"-0.116289616,0.84380096,-0.9512577,0.8471116,-0.6770522,-0.11391378,-0.54470736,0.6372372,-0.6258478,-0.4619868"
100124,"-0.55520624,-0.38450208,-0.97516394,0.65066177,1.1034276,0.80535024,1.2053118,-0.89798784,0.22226325,-0.29825503"
100113,"-0.24199975,-0.28298575,0.33803526,0.30864722,-0.6176739,-0.28926894,-0.2299306,-0.538322,0.24892178,-0.1707981"
200209,"0.054264106,-1.1422969,0.08590874,-1.3793038,0.29004374,1.4312099,-0.8572432,-0.5766048,-1.0941877,0.8860583"
100102,"0.41648522,-0.21271901,0.05717493,0.7454183,-0.8523844,-1.1702945,-0.28996572,-0.8403517,0.39748332,0.3390403"
100128,"0.7588039,0.58703107,-0.0035145553,-1.4246271,1.1518689,-0.06665376,-0.16574706,1.3045402,0.30567664,-0.24800922"
100117,"0.6960717,0.968848,-0.4298331,0.67129207,0.6361132,-0.11108981,0.060985077,-0.11992605,1.143042,-1.1125845"
200206,"-0.15440114,-1.1392,0.31327793,-1.0319531,-0.38255128,1.0323244,-0.9257757,-0.86566424,-0.71903104,0.8611776"
100135,"0.68473977,0.14446336,0.06309112,0.7735213,-0.7144448,-1.57575,-0.51429063,-0.8386964,0.64574856,0.7606994"
200204,"-0.65552425,-0.26584873,-0.16424261,0.17692143,-0.5599459,-0.40841553,-0.59785163,-0.5969927,0.25059423,-0.10329913"
200226,"-0.0014029042,-0.08124011,-0.17700095,0.190535,-1.0494093,0.2339716,0.51905715,0.022988198,-0.42938218,0.030018305"
200215,"-0.59639597,1.3267294,-0.41570538,0.12435667,-0.3779702,0.6096429,-1.057555,0.43857932,0.8381686,0.79614824"
200228,"0.24766994,0.99213505,-0.68174803,0.7273676,-0.26963142,-0.12180694,-0.2684242,0.37725127,-0.30483937,-0.3227727"
200217,"0.23262045,0.2151069,-0.11492382,-0.34223357,-0.48913825,0.9626117,0.9085772,-0.59660095,0.10418337,0.22711802"
100106,"-0.9401228,-0.7071916,0.31149504,-0.27265194,-0.09717237,-0.40086234,-0.38632423,-0.6318814,0.031849563,-0.4036767"
100133,"-0.55126655,0.3595679,0.43583208,-1.4850545,0.33916962,0.3267645,-0.5961375,1.2126684,-0.20301718,-0.62530035"
100105,"-1.141776,-0.56736225,0.9058542,0.24221432,-0.83019125,-0.02176991,0.17053823,0.15656224,0.28293177,0.18136409"
100116,"-0.18595839,-0.94216806,-0.04402619,-0.6167166,-0.5941406,0.38915515,1.3682247,0.2236175,-0.49129808,0.3029437"
100127,"0.2593141,0.18698022,-0.66509056,1.0358491,-0.38405955,0.018942915,-1.0355325,-0.21051697,-1.1265682,0.09525686"
100112,"-0.042979628,-0.7885905,0.06278038,0.35335407,-1.2797931,0.07384887,0.2974453,-0.12469553,-0.8044598,-0.8508574"
200208,"-0.5667075,-0.23611353,-0.3137477,0.82842255,0.5862991,0.3500698,-0.25780874,-1.5043914,0.16229104,-0.44204435"
100134,"-1.0283784,0.4516527,0.2514723,-0.025677443,0.505183,0.33416566,-0.30657545,1.034264,-0.8255558,1.2233999"
100101,"-0.08951938,0.61050475,0.051086098,0.36226818,-0.91954124,0.34435794,-0.4068702,-0.23857933,0.3954247,0.65097666"
100130,"-0.040900983,-0.6131468,-0.15082622,0.45202407,-0.5129537,0.21415077,-0.20611458,-0.09342998,-0.6472816,-0.99554676"
200219,"-0.45674065,-0.94819766,-0.43142143,1.2685776,-0.6344654,-0.034292433,0.14550963,-0.64301395,-1.1110151,-0.8273001"
200220,"-0.035573825,-0.111919366,0.63053656,-0.51218855,-0.83586997,-1.35585,-0.6412666,0.5639862,0.23539433,-1.2801476"
100141,"0.17283371,0.3625268,-0.11866944,-0.9542517,0.0602617,0.40863004,0.98127556,0.6200347,0.33603096,-0.40085405"
100100,"-0.1243759,-0.2233241,0.17267902,0.37823424,-0.5270333,-0.20832668,-0.29057467,-0.557378,0.05669979,-0.17932041"
200203,"0.7436515,-0.12810707,-0.5108933,0.709453,0.04173995,-1.8708509,-1.1464739,-0.97578037,0.06196577,0.67240846"
200214,"0.61146283,-0.4831884,-0.61101353,-0.34793016,0.2766603,-0.33624154,0.3432471,0.52221227,-0.71244633,0.21606725"
100144,"0.051641393,-0.7699267,-0.50901455,-0.47493026,-0.28847322,0.058909822,1.7402827,0.36914262,-0.36113855,0.1472688"
100149,"-0.055582464,-0.55988926,-0.045261003,0.41439527,-0.647424,0.16651118,-0.21542674,0.057645723,-0.9293561,-0.7009198"
100138,"-1.1716477,-1.1547388,0.21127033,-0.5847549,0.42012757,-0.57998055,0.511533,-1.1928324,0.16678414,-0.31474906"
100111,"0.42003542,0.67836154,0.01290681,0.36908978,-0.6514716,0.15846728,-0.53253603,-0.08548763,0.69215715,-0.31154138"
100123,"-0.2922913,-1.4195411,0.45312524,-1.6936549,-0.15403968,1.7928833,-0.60448474,-0.36205631,-0.8912172,0.64750373"
100122,"-0.45180693,0.11360877,-0.0906804,0.16817826,1.3335919,0.28371724,-0.5056065,1.2623284,-0.8638854,0.66491354"

appendix

The Nebula Algorithm Conf

{
  # Spark relation config
  spark: {
    app: {
        name: node2vec
        # spark.app.partitionNum
        partitionNum:100
    }
    master:local
  }

  data: {
    # data source. optional of nebula,csv,json
    source: nebula
    # data sink, means the algorithm result will be write into this sink. optional of nebula,csv,text
    sink: csv
    # if your algorithm needs weight
    hasWeight: false
  }

  # Nebula Graph relation config
  nebula: {
    # algo's data source from Nebula. If data.source is nebula, then this nebula.read config can be valid.
    read: {
        # Nebula metad server address, multiple addresses are split by English comma
        metaAddress: "metad0:9559,metad1:9559,metad2:9559"
        # Nebula space
        space: nba_int_vid
        # Nebula edge types, multiple labels means that data from multiple edges will union together
        labels: ["serve"]
        # Nebula edge property name for each edge type, this property will be as weight col for algorithm.
        # Make sure the weightCols are corresponding to labels.
        weightCols: ["start_year"]
    }

    # algo result sink into Nebula. If data.sink is nebula, then this nebula.write config can be valid.
    write:{
        # Nebula graphd server address, multiple addresses are split by English comma
        graphAddress: "graphd:9669"
        # Nebula metad server address, multiple addresses are split by English comma
        metaAddress: "metad0:9559,metad1:9559,metad2:9559"
        user:root
        pswd:nebula
        # Nebula space name
        space:nba_int_vid
        # Nebula tag name, the algorithm result will be write into this tag
        tag:node2vec
        # algorithm result is insert into new tag or update to original tag. type: insert/update
        type:insert
    }
  }

  local: {
    # algo's data source from Nebula. If data.source is csv or json, then this local.read can be valid.
    read:{
        filePath: "file:///tmp/algo_edge.csv"
        # srcId column
        srcId:"_c0"
        # dstId column
        dstId:"_c1"
        # weight column
        #weight: "col3"
        # if csv file has header
        header: false
        # csv file's delimiter
        delimiter:","
    }

    # algo result sink into local file. If data.sink is csv or text, then this local.write can be valid.
    write:{
        resultPath:/tmp
    }
  }


  algorithm: {
    # the algorithm that you are going to execute,pick one from [pagerank, louvain, connectedcomponent,
    # labelpropagation, shortestpaths, degreestatic, kcore, stronglyconnectedcomponent, trianglecount,
    # betweenness, graphtriangleCount, clusteringcoefficient, bfs, hanp, closeness, jaccard, node2vec]
    executeAlgo: node2vec

   #Node2vecAlgo parameter
   node2vec:{
       maxIter: 10,
       lr: 0.025,
       dataNumPartition: 10,
       modelNumPartition: 10,
       dim: 10,
       window: 3,
       walkLength: 5,
       numWalks: 3,
       p: 1.0,
       q: 1.0,
       directed: false,
       degree: 30,
       embSeparate: ",",
       modelPath: "hdfs://namenode:9000/model"
   }

 }
}

The graph data

nba_int_vid.ngql

drop space nba_int_vid;
create space nba_int_vid(partition_num=10,replica_factor=1,vid_type=fixed_string(32));
:sleep 20
use nba_int_vid;
create tag player(name string,age int);
create tag team(name string);
create edge serve(start_year int,end_year int);
create edge follow(degree int);
:sleep 20
create tag index player_index_0 on player();
create tag index player_index_1 on player(name(20));
:sleep 20
insert vertex player(name,age) values "100100":("Tim Duncan", 42);
insert vertex player(name,age) values "100101":("Tony Parker", 36);
insert vertex player(name,age) values "100102":("LaMarcus Aldridge", 33);
insert vertex player(name,age) values "100103":("Rudy Gay", 32);
insert vertex player(name,age) values "100104":("Marco Belinelli", 32);
insert vertex player(name,age) values "100105":("Danny Green", 31);
insert vertex player(name,age) values "100106":("Kyle Anderson", 25);
insert vertex player(name,age) values "100107":("Aron Baynes", 32);
insert vertex player(name,age) values "100108":("Boris Diaw", 36);
insert vertex player(name,age) values "100109":("Tiago Splitter", 34);
insert vertex player(name,age) values "100110":("Cory Joseph", 27);
insert vertex player(name,age) values "100111":("David West", 38);
insert vertex player(name,age) values "100112":("Jonathon Simmons", 29);
insert vertex player(name,age) values "100113":("Dejounte Murray", 29);
insert vertex player(name,age) values "100114":("Tracy McGrady", 39);
insert vertex player(name,age) values "100115":("Kobe Bryant", 40);
insert vertex player(name,age) values "100116":("LeBron James", 34);
insert vertex player(name,age) values "100117":("Stephen Curry", 31);
insert vertex player(name,age) values "100118":("Russell Westbrook", 30);
insert vertex player(name,age) values "100119":("Kevin Durant", 30);
insert vertex player(name,age) values "100120":("James Harden", 29);
insert vertex player(name,age) values "100121":("Chris Paul", 33);
insert vertex player(name,age) values "100122":("DeAndre Jordan", 30);
insert vertex player(name,age) values "100123":("Ricky Rubio", 28);
insert vertex player(name,age) values "100124":("Rajon Rondo", 33);
insert vertex player(name,age) values "100125":("Manu Ginobili", 41);
insert vertex player(name,age) values "100126":("Kyrie Irving", 26);
insert vertex player(name,age) values "100127":("Vince Carter", 42);
insert vertex player(name,age) values "100128":("Carmelo Anthony", 34);
insert vertex player(name,age) values "100129":("Dwyane Wade", 37);
insert vertex player(name,age) values "100130":("Joel Embiid", 25);
insert vertex player(name,age) values "100131":("Paul George", 28);
insert vertex player(name,age) values "100132":("Giannis Antetokounmpo", 24);
insert vertex player(name,age) values "100133":("Yao Ming", 38);
insert vertex player(name,age) values "100134":("Blake Griffin", 30);
insert vertex player(name,age) values "100135":("Damian Lillard", 28);
insert vertex player(name,age) values "100136":("Steve Nash", 45);
insert vertex player(name,age) values "100137":("Dirk Nowitzki", 40);
insert vertex player(name,age) values "100138":("Paul Gasol", 38);
insert vertex player(name,age) values "100139":("Marc Gasol", 34);
insert vertex player(name,age) values "100140":("Grant Hill", 46);
insert vertex player(name,age) values "100141":("Ray Allen", 43);
insert vertex player(name,age) values "100142":("Klay Thompson", 29);
insert vertex player(name,age) values "100143":("Kristaps Porzingis", 23);
insert vertex player(name,age) values "100144":("Shaquille O'Neal", 47);
insert vertex player(name,age) values "100145":("JaVale McGee", 31);
insert vertex player(name,age) values "100146":("Dwight Howard", 33);
insert vertex player(name,age) values "100147":("Amar'e Stoudemire", 36);
insert vertex player(name,age) values "100148":("Jason Kidd", 45);
insert vertex player(name,age) values "100149":("Ben Simmons", 22);
insert vertex player(name,age) values "100150":("Luka Doncic", 20);
insert vertex team(name) values "200200":("Warriors");
insert vertex team(name) values "200201":("Nuggets");
insert vertex team(name) values "200202":("Rockets");
insert vertex team(name) values "200203":("Trail Blazers");
insert vertex team(name) values "200204":("Spurs");
insert vertex team(name) values "200205":("Thunders");
insert vertex team(name) values "200206":("Jazz");
insert vertex team(name) values "200207":("Clippers");
insert vertex team(name) values "200208":("Kings");
insert vertex team(name) values "200209":("Timberwolves");
insert vertex team(name) values "200210":("Lakers");
insert vertex team(name) values "200211":("Pelicans");
insert vertex team(name) values "200212":("Grizzlies");
insert vertex team(name) values "200213":("Mavericks");
insert vertex team(name) values "200214":("Suns");
insert vertex team(name) values "200215":("Hornets");
insert vertex team(name) values "200216":("Cavaliers");
insert vertex team(name) values "200217":("Celtics");
insert vertex team(name) values "200218":("Raptors");
insert vertex team(name) values "200219":("76ers");
insert vertex team(name) values "200220":("Pacers");
insert vertex team(name) values "200221":("Bulls");
insert vertex team(name) values "200222":("Hawks");
insert vertex team(name) values "200223":("Knicks");
insert vertex team(name) values "200224":("Pistons");
insert vertex team(name) values "200225":("Bucks");
insert vertex team(name) values "200226":("Magic");
insert vertex team(name) values "200227":("Nets");
insert vertex team(name) values "200228":("Wizards");
insert vertex team(name) values "200229":("Heat");
insert edge follow(degree) values "100100"->"100101":(95);
insert edge follow(degree) values "100100"->"100125":(95);
insert edge follow(degree) values "100101"->"100100":(95);
insert edge follow(degree) values "100101"->"100125":(95);
insert edge follow(degree) values "100101"->"100102":(90);
insert edge follow(degree) values "100125"->"100100":(90);
insert edge follow(degree) values "100102"->"100101":(75);
insert edge follow(degree) values "100102"->"100100":(75);
insert edge follow(degree) values "100103"->"100102":(70);
insert edge follow(degree) values "100104"->"100101":(50);
insert edge follow(degree) values "100104"->"100100":(55);
insert edge follow(degree) values "100104"->"100105":(60);
insert edge follow(degree) values "100105"->"100104":(83);
insert edge follow(degree) values "100105"->"100100":(70);
insert edge follow(degree) values "100105"->"100116":(80);
insert edge follow(degree) values "100107"->"100100":(80);
insert edge follow(degree) values "100108"->"100101":(80);
insert edge follow(degree) values "100108"->"100100":(80);
insert edge follow(degree) values "100109"->"100100":(80);
insert edge follow(degree) values "100109"->"100125":(90);
insert edge follow(degree) values "100113"->"100100":(99);
insert edge follow(degree) values "100113"->"100101":(99);
insert edge follow(degree) values "100113"->"100125":(99);
insert edge follow(degree) values "100113"->"100104":(99);
insert edge follow(degree) values "100113"->"100105":(99);
insert edge follow(degree) values "100113"->"100116":(99);
insert edge follow(degree) values "100113"->"100118":(99);
insert edge follow(degree) values "100113"->"100121":(99);
insert edge follow(degree) values "100113"->"100106":(99);
insert edge follow(degree) values "100113"->"100119":(99);
insert edge follow(degree) values "100113"->"100120":(99);
insert edge follow(degree) values "100114"->"100115":(90);
insert edge follow(degree) values "100114"->"100140":(90);
insert edge follow(degree) values "100114"->"100103":(90);
insert edge follow(degree) values "100116"->"100141":(100);
insert edge follow(degree) values "100118"->"100131":(90);
insert edge follow(degree) values "100118"->"100120":(90);
insert edge follow(degree) values "100120"->"100118":(80);
insert edge follow(degree) values "100121"->"100116":(90);
insert edge follow(degree) values "100121"->"100128":(90);
insert edge follow(degree) values "100121"->"100129":(90);
insert edge follow(degree) values "100124"->"100141":(-1);
insert edge follow(degree) values "100126"->"100116":(13);
insert edge follow(degree) values "100127"->"100114":(90);
insert edge follow(degree) values "100127"->"100148":(70);
insert edge follow(degree) values "100128"->"100116":(90);
insert edge follow(degree) values "100128"->"100121":(90);
insert edge follow(degree) values "100128"->"100129":(90);
insert edge follow(degree) values "100129"->"100116":(90);
insert edge follow(degree) values "100129"->"100121":(90);
insert edge follow(degree) values "100129"->"100128":(90);
insert edge follow(degree) values "100130"->"100149":(80);
insert edge follow(degree) values "100131"->"100118":(95);
insert edge follow(degree) values "100133"->"100114":(90);
insert edge follow(degree) values "100133"->"100144":(90);
insert edge follow(degree) values "100134"->"100121":(-1);
insert edge follow(degree) values "100135"->"100102":(80);
insert edge follow(degree) values "100136"->"100147":(90);
insert edge follow(degree) values "100136"->"100137":(88);
insert edge follow(degree) values "100136"->"100117":(90);
insert edge follow(degree) values "100136"->"100148":(85);
insert edge follow(degree) values "100137"->"100136":(80);
insert edge follow(degree) values "100137"->"100148":(80);
insert edge follow(degree) values "100137"->"100129":(10);
insert edge follow(degree) values "100138"->"100115":(90);
insert edge follow(degree) values "100138"->"100139":(99);
insert edge follow(degree) values "100139"->"100138":(99);
insert edge follow(degree) values "100140"->"100114":(90);
insert edge follow(degree) values "100141"->"100124":(9);
insert edge follow(degree) values "100142"->"100117":(90);
insert edge follow(degree) values "100143"->"100150":(90);
insert edge follow(degree) values "100144"->"100145":(100);
insert edge follow(degree) values "100144"->"100100":(80);
insert edge follow(degree) values "100147"->"100136":(90);
insert edge follow(degree) values "100148"->"100127":(80);
insert edge follow(degree) values "100148"->"100136":(90);
insert edge follow(degree) values "100148"->"100137":(85);
insert edge follow(degree) values "100149"->"100130":(80);
insert edge follow(degree) values "100150"->"100137":(90);
insert edge follow(degree) values "100150"->"100143":(90);
insert edge follow(degree) values "100150"->"100120":(80);
insert edge serve(start_year,end_year) values "100100"->"200204":(1997, 2016);
insert edge serve(start_year,end_year) values "100101"->"200204":(1999, 2018);
insert edge serve(start_year,end_year) values "100101"->"200215":(2018, 2019);
insert edge serve(start_year,end_year) values "100102"->"200203":(2006, 2015);
insert edge serve(start_year,end_year) values "100102"->"200204":(2015, 2019);
insert edge serve(start_year,end_year) values "100103"->"200212":(2006, 2013);
insert edge serve(start_year,end_year) values "100103"->"200218":(2013, 2013);
insert edge serve(start_year,end_year) values "100103"->"200208":(2013, 2017);
insert edge serve(start_year,end_year) values "100103"->"200204":(2017, 2019);
insert edge serve(start_year,end_year) values "100104"->"200200":(2007, 2009);
insert edge serve(start_year,end_year) values "100104"->"200218":(2009, 2010);
insert edge serve(start_year,end_year) values "100104"->"200215"@20102012:(2010, 2012);
insert edge serve(start_year,end_year) values "100104"->"200221":(2012, 2013);
insert edge serve(start_year,end_year) values "100104"->"200204"@20132015:(2013, 2015);
insert edge serve(start_year,end_year) values "100104"->"200208":(2015, 2016);
insert edge serve(start_year,end_year) values "100104"->"200215"@20162017:(2016, 2017);
insert edge serve(start_year,end_year) values "100104"->"200222":(2017, 2018);
insert edge serve(start_year,end_year) values "100104"->"200219":(2018, 2018);
insert edge serve(start_year,end_year) values "100104"->"200204"@20182019:(2018, 2019);
insert edge serve(start_year,end_year) values "100105"->"200216":(2009, 2010);
insert edge serve(start_year,end_year) values "100105"->"200204":(2010, 2018);
insert edge serve(start_year,end_year) values "100105"->"200218":(2018, 2019);
insert edge serve(start_year,end_year) values "100106"->"200204":(2014, 2018);
insert edge serve(start_year,end_year) values "100106"->"200212":(2018, 2019);
insert edge serve(start_year,end_year) values "100107"->"200204":(2013, 2015);
insert edge serve(start_year,end_year) values "100107"->"200224":(2015, 2017);
insert edge serve(start_year,end_year) values "100107"->"200217":(2017, 2019);
insert edge serve(start_year,end_year) values "100108"->"200222":(2003, 2005);
insert edge serve(start_year,end_year) values "100108"->"200214":(2005, 2008);
insert edge serve(start_year,end_year) values "100108"->"200215":(2008, 2012);
insert edge serve(start_year,end_year) values "100108"->"200204":(2012, 2016);
insert edge serve(start_year,end_year) values "100108"->"200206":(2016, 2017);
insert edge serve(start_year,end_year) values "100109"->"200204":(2010, 2015);
insert edge serve(start_year,end_year) values "100109"->"200222":(2015, 2017);
insert edge serve(start_year,end_year) values "100109"->"200219":(2017, 2017);
insert edge serve(start_year,end_year) values "100110"->"200204":(2011, 2015);
insert edge serve(start_year,end_year) values "100110"->"200218":(2015, 2017);
insert edge serve(start_year,end_year) values "100110"->"200220":(2017, 2019);
insert edge serve(start_year,end_year) values "100111"->"200215":(2003, 2011);
insert edge serve(start_year,end_year) values "100111"->"200220":(2011, 2015);
insert edge serve(start_year,end_year) values "100111"->"200204":(2015, 2016);
insert edge serve(start_year,end_year) values "100111"->"200200":(2016, 2018);
insert edge serve(start_year,end_year) values "100112"->"200204":(2015, 2017);
insert edge serve(start_year,end_year) values "100112"->"200226":(2017, 2019);
insert edge serve(start_year,end_year) values "100112"->"200219":(2019, 2019);
insert edge serve(start_year,end_year) values "100113"->"200204":(2016, 2019);
insert edge serve(start_year,end_year) values "100114"->"200218":(1997, 2000);
insert edge serve(start_year,end_year) values "100114"->"200226":(2000, 2004);
insert edge serve(start_year,end_year) values "100114"->"200202":(2004, 2010);
insert edge serve(start_year,end_year) values "100114"->"200204":(2013, 2013);
insert edge serve(start_year,end_year) values "100115"->"200210":(1996, 2016);
insert edge serve(start_year,end_year) values "100116"->"200216"@20032010:(2003, 2010);
insert edge serve(start_year,end_year) values "100116"->"200229":(2010, 2014);
insert edge serve(start_year,end_year) values "100116"->"200216"@20142018:(2014, 2018);
insert edge serve(start_year,end_year) values "100116"->"200210":(2018, 2019);
insert edge serve(start_year,end_year) values "100117"->"200200":(2009, 2019);;
insert edge serve(start_year,end_year) values "100118"->"200205":(2008, 2019);
insert edge serve(start_year,end_year) values "100119"->"200205":(2007, 2016);
insert edge serve(start_year,end_year) values "100119"->"200200":(2016, 2019);
insert edge serve(start_year,end_year) values "100120"->"200205":(2009, 2012);
insert edge serve(start_year,end_year) values "100120"->"200202":(2012, 2019);
insert edge serve(start_year,end_year) values "100121"->"200215":(2005, 2011);
insert edge serve(start_year,end_year) values "100121"->"200207":(2011, 2017);
insert edge serve(start_year,end_year) values "100121"->"200202":(2017, 2021);
insert edge serve(start_year,end_year) values "100122"->"200207":(2008, 2018);
insert edge serve(start_year,end_year) values "100122"->"200213":(2018, 2019);
insert edge serve(start_year,end_year) values "100122"->"200223":(2019, 2019);
insert edge serve(start_year,end_year) values "100123"->"200209":(2011, 2017);
insert edge serve(start_year,end_year) values "100123"->"200206":(2017, 2019);
insert edge serve(start_year,end_year) values "100124"->"200217":(2006, 2014);
insert edge serve(start_year,end_year) values "100124"->"200213":(2014, 2015);
insert edge serve(start_year,end_year) values "100124"->"200208":(2015, 2016);
insert edge serve(start_year,end_year) values "100124"->"200221":(2016, 2017);
insert edge serve(start_year,end_year) values "100124"->"200211":(2017, 2018);
insert edge serve(start_year,end_year) values "100124"->"200210":(2018, 2019);
insert edge serve(start_year,end_year) values "100125"->"200204":(2002, 2018);
insert edge serve(start_year,end_year) values "100126"->"200216":(2011, 2017);
insert edge serve(start_year,end_year) values "100126"->"200217":(2017, 2019);
insert edge serve(start_year,end_year) values "100127"->"200218":(1998, 2004);
insert edge serve(start_year,end_year) values "100127"->"200227":(2004, 2009);
insert edge serve(start_year,end_year) values "100127"->"200226":(2009, 2010);
insert edge serve(start_year,end_year) values "100127"->"200214":(2010, 2011);
insert edge serve(start_year,end_year) values "100127"->"200213":(2011, 2014);
insert edge serve(start_year,end_year) values "100127"->"200212":(2014, 2017);
insert edge serve(start_year,end_year) values "100127"->"200208":(2017, 2018);
insert edge serve(start_year,end_year) values "100127"->"200222":(2018, 2019);
insert edge serve(start_year,end_year) values "100128"->"200201":(2003, 2011);
insert edge serve(start_year,end_year) values "100128"->"200223":(2011, 2017);
insert edge serve(start_year,end_year) values "100128"->"200205":(2017, 2018);
insert edge serve(start_year,end_year) values "100128"->"200202":(2018, 2019);
insert edge serve(start_year,end_year) values "100129"->"200229"@20032016:(2003, 2016);
insert edge serve(start_year,end_year) values "100129"->"200221":(2016, 2017);
insert edge serve(start_year,end_year) values "100129"->"200216":(2017, 2018);
insert edge serve(start_year,end_year) values "100129"->"200229"@20182019:(2018, 2019);
insert edge serve(start_year,end_year) values "100130"->"200219":(2014, 2019);
insert edge serve(start_year,end_year) values "100131"->"200220":(2010, 2017);
insert edge serve(start_year,end_year) values "100131"->"200205":(2017, 2019);
insert edge serve(start_year,end_year) values "100132"->"200225":(2013, 2019);
insert edge serve(start_year,end_year) values "100133"->"200202":(2002, 2011);
insert edge serve(start_year,end_year) values "100134"->"200207":(2009, 2018);
insert edge serve(start_year,end_year) values "100134"->"200224":(2018, 2019);
insert edge serve(start_year,end_year) values "100135"->"200203":(2012, 2019);
insert edge serve(start_year,end_year) values "100136"->"200214"@19961998:(1996, 1998);
insert edge serve(start_year,end_year) values "100136"->"200213":(1998, 2004);
insert edge serve(start_year,end_year) values "100136"->"200214"@20042012:(2004, 2012);
insert edge serve(start_year,end_year) values "100136"->"200210":(2012, 2015);
insert edge serve(start_year,end_year) values "100137"->"200213":(1998, 2019);
insert edge serve(start_year,end_year) values "100138"->"200212":(2001, 2008);
insert edge serve(start_year,end_year) values "100138"->"200210":(2008, 2014);
insert edge serve(start_year,end_year) values "100138"->"200221":(2014, 2016);
insert edge serve(start_year,end_year) values "100138"->"200204":(2016, 2019);
insert edge serve(start_year,end_year) values "100138"->"200225":(2019, 2020);
insert edge serve(start_year,end_year) values "100139"->"200212":(2008, 2019);
insert edge serve(start_year,end_year) values "100139"->"200218":(2019, 2019);
insert edge serve(start_year,end_year) values "100140"->"200224":(1994, 2000);
insert edge serve(start_year,end_year) values "100140"->"200226":(2000, 2007);
insert edge serve(start_year,end_year) values "100140"->"200214":(2007, 2012);
insert edge serve(start_year,end_year) values "100140"->"200207":(2012, 2013);
insert edge serve(start_year,end_year) values "100141"->"200225":(1996, 2003);
insert edge serve(start_year,end_year) values "100141"->"200205":(2003, 2007);
insert edge serve(start_year,end_year) values "100141"->"200217":(2007, 2012);
insert edge serve(start_year,end_year) values "100141"->"200229":(2012, 2014);
insert edge serve(start_year,end_year) values "100142"->"200200":(2011, 2019);
insert edge serve(start_year,end_year) values "100143"->"200223":(2015, 2019);
insert edge serve(start_year,end_year) values "100143"->"200213":(2019, 2020);
insert edge serve(start_year,end_year) values "100144"->"200226":(1992, 1996);
insert edge serve(start_year,end_year) values "100144"->"200210":(1996, 2004);
insert edge serve(start_year,end_year) values "100144"->"200229":(2004, 2008);
insert edge serve(start_year,end_year) values "100144"->"200214":(2008, 2009);
insert edge serve(start_year,end_year) values "100144"->"200216":(2009, 2010);
insert edge serve(start_year,end_year) values "100144"->"200217":(2010, 2011);
insert edge serve(start_year,end_year) values "100145"->"200228":(2008, 2012);
insert edge serve(start_year,end_year) values "100145"->"200201":(2012, 2015);
insert edge serve(start_year,end_year) values "100145"->"200213":(2015, 2016);
insert edge serve(start_year,end_year) values "100145"->"200200":(2016, 2018);
insert edge serve(start_year,end_year) values "100145"->"200210":(2018, 2019);
insert edge serve(start_year,end_year) values "100146"->"200226":(2004, 2012);
insert edge serve(start_year,end_year) values "100146"->"200210":(2012, 2013);
insert edge serve(start_year,end_year) values "100146"->"200202":(2013, 2016);
insert edge serve(start_year,end_year) values "100146"->"200222":(2016, 2017);
insert edge serve(start_year,end_year) values "100146"->"200215":(2017, 2018);
insert edge serve(start_year,end_year) values "100146"->"200228":(2018, 2019);
insert edge serve(start_year,end_year) values "100147"->"200214":(2002, 2010);
insert edge serve(start_year,end_year) values "100147"->"200223":(2010, 2015);
insert edge serve(start_year,end_year) values "100147"->"200229":(2015, 2016);
insert edge serve(start_year,end_year) values "100148"->"200213"@19941996:(1994, 1996);
insert edge serve(start_year,end_year) values "100148"->"200214":(1996, 2001);
insert edge serve(start_year,end_year) values "100148"->"200227":(2001, 2008);
insert edge serve(start_year,end_year) values "100148"->"200213"@20082012:(2008, 2012);
insert edge serve(start_year,end_year) values "100148"->"200223":(2012, 2013);
insert edge serve(start_year,end_year) values "100149"->"200219":(2016, 2019);
insert edge serve(start_year,end_year) values "100150"->"200213":(2018, 2019);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment