├── seeds ├── seeds_macro │ ├── BI_13.txt │ ├── BI_15.txt │ ├── BI_17.txt │ ├── BI_23.txt │ ├── BI_24.txt │ ├── BI_3.txt │ ├── BI_5.txt │ ├── BI_8.txt │ ├── BI_6.txt │ ├── IC_7.txt │ ├── IC_8.txt │ ├── BI_1.txt │ ├── BI_7.txt │ ├── BI_20.txt │ ├── IC_10.txt │ ├── BI_22.txt │ ├── BI_4.txt │ ├── BI_12.txt │ ├── IC_1.txt │ ├── IC_6.txt │ ├── BI_10.txt │ ├── BI_21.txt │ ├── IC_13.txt │ ├── IC_14.txt │ ├── IC_2.txt │ ├── IC_5.txt │ ├── IC_9.txt │ ├── BI_14.txt │ ├── IC_12.txt │ ├── BI_11.txt │ ├── BI_18.txt │ ├── BI_19.txt │ ├── IC_11.txt │ ├── BI_9.txt │ ├── IC_4.txt │ ├── BI_2.txt │ ├── IC_3.txt │ ├── BI_16.txt │ └── BI_25.txt ├── seeds_10 │ ├── interactive_0_0_is3.csv │ ├── interactive_0_0_is4.csv │ ├── interactive_0_0_is5.csv │ ├── interactive_0_0_is6.csv │ ├── interactive_0_0_is7.csv │ ├── interactive_0_0_is2.csv │ └── interactive_0_0_is1.csv ├── seeds_1 │ ├── interactive_0_0_is4.csv │ ├── interactive_0_0_is5.csv │ ├── interactive_0_0_is6.csv │ ├── interactive_0_0_is7.csv │ ├── interactive_0_0_is3.csv │ ├── interactive_0_0_is2.csv │ └── interactive_0_0_is1.csv └── seeds_100 │ ├── interactive_0_0_is3.csv │ ├── interactive_0_0_is2.csv │ ├── interactive_0_0_is1.csv │ ├── interactive_0_0_is4.csv │ ├── interactive_0_0_is5.csv │ ├── interactive_0_0_is6.csv │ └── interactive_0_0_is7.csv ├── neo4j ├── load_scripts │ ├── show-db-size.sh │ ├── restart-neo4j.sh │ ├── delete-neo4j-database.sh │ ├── path.sh │ ├── load-in-one-step.sh │ ├── index_time.sh │ ├── drop-index-ldbc.cql │ ├── index-ldbc.cql │ ├── convert-data.sh │ ├── headers.txt │ └── import-to-neo4j.sh ├── run_bi.sh ├── run_ch.sh ├── run_ic.sh ├── run_id.sh ├── run_ii.sh ├── run_is.sh ├── run_all.sh ├── run_id.py ├── run_ch.py └── run_is.py ├── preview.pdf ├── agens ├── load_scripts │ ├── path.sh │ ├── reindex.sql │ ├── create_vertex_indexes.sql │ ├── agens-clean.sql │ ├── data-convert.sh │ └── headers.txt ├── run_ch.sh ├── run_ic.sh ├── run_id.sh ├── run_ii.sh ├── run_is.sh ├── run_all.sh ├── run_bi.sh ├── weight_precal.sql ├── run_is.py ├── run_ch.py └── run_id.py ├── light ├── run_ch.sh ├── run_id.sh ├── run_ii.sh ├── run_is.sh ├── load_scripts │ ├── path.sh │ ├── lgraph_server.json │ ├── convert_data.sh │ └── data_import.conf ├── run_micro_all.sh ├── run_is.py ├── run_ch.py ├── run_id.py └── README.md ├── tiger ├── queries │ ├── interactive_insert │ │ ├── id_6.gsql │ │ ├── id_4.gsql │ │ ├── id_1.gsql │ │ ├── id_7.gsql │ │ ├── ii_5.gsql │ │ ├── ii_2.gsql │ │ ├── id_2.gsql │ │ ├── ii_3.gsql │ │ ├── ii_8.gsql │ │ ├── id_5.gsql │ │ ├── id_3.gsql │ │ ├── id_8.gsql │ │ ├── ii_4.gsql │ │ ├── ii_7.gsql │ │ ├── ii_1.gsql │ │ └── ii_6.gsql │ ├── helper │ │ ├── to_jsonarray.gsql │ │ ├── get_messages_from_person.gsql │ │ └── ExprFunctions.hpp │ ├── interactive_short │ │ ├── is_3.gsql │ │ ├── is_1.gsql │ │ ├── is_5.gsql │ │ ├── is_4.gsql │ │ ├── is_6.gsql │ │ ├── is_7.gsql │ │ └── is_2.gsql │ ├── business_intelligence │ │ ├── bi_12.gsql │ │ ├── bi_23.gsql │ │ ├── bi_8.gsql │ │ ├── bi_3.gsql │ │ ├── bi_20.gsql │ │ ├── bi_14.gsql │ │ ├── bi_1.gsql │ │ ├── bi_10.gsql │ │ ├── bi_15.gsql │ │ ├── bi_17.gsql │ │ ├── bi_4.gsql │ │ ├── bi_24.gsql │ │ ├── bi_13.gsql │ │ ├── bi_18.gsql │ │ ├── bi_5.gsql │ │ ├── bi_2.gsql │ │ ├── bi_7.gsql │ │ ├── bi_9.gsql │ │ ├── bi_21.gsql │ │ ├── bi_6.gsql │ │ ├── bi_16.gsql │ │ ├── bi_19.gsql │ │ └── bi_11.gsql │ ├── interactive_complex │ │ ├── ic_2.gsql │ │ ├── ic_8.gsql │ │ ├── ic_4.gsql │ │ ├── ic_6.gsql │ │ ├── ic_5.gsql │ │ ├── ic_11.gsql │ │ ├── ic_9.gsql │ │ ├── ic_13.gsql │ │ ├── ic_10.gsql │ │ ├── ic_12.gsql │ │ ├── ic_7.gsql │ │ ├── ic_3.gsql │ │ └── ic_1.gsql │ └── install_queries.sh ├── load_scripts │ ├── path.sh │ ├── one_step_load.sh │ ├── load_data.sh │ └── time.py └── run_all.sh ├── params.ini └── README.md /seeds/seeds_macro/BI_13.txt: -------------------------------------------------------------------------------- 1 | country 2 | Burma 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_15.txt: -------------------------------------------------------------------------------- 1 | country 2 | Burma 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_17.txt: -------------------------------------------------------------------------------- 1 | country 2 | Spain 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_23.txt: -------------------------------------------------------------------------------- 1 | country 2 | Egypt 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_24.txt: -------------------------------------------------------------------------------- 1 | tagClass 2 | Single 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_3.txt: -------------------------------------------------------------------------------- 1 | year|month 2 | 2010|10 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_5.txt: -------------------------------------------------------------------------------- 1 | country 2 | Belarus 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_8.txt: -------------------------------------------------------------------------------- 1 | tag 2 | Genghis_Khan 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_6.txt: -------------------------------------------------------------------------------- 1 | tag 2 | Abbas_I_of_Persia 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/IC_7.txt: -------------------------------------------------------------------------------- 1 | personId 2 | 17592186053137 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/IC_8.txt: -------------------------------------------------------------------------------- 1 | personId 2 | 24189255818757 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_1.txt: -------------------------------------------------------------------------------- 1 | date 2 | 2012-05-01 00:00:00 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_7.txt: -------------------------------------------------------------------------------- 1 | tag 2 | Arnold_Schwarzenegger 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_20.txt: -------------------------------------------------------------------------------- 1 | tagClasses 2 | Writer;Single;Country 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/IC_10.txt: -------------------------------------------------------------------------------- 1 | personId|month 2 | 30786325583618|11 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_22.txt: -------------------------------------------------------------------------------- 1 | country1|country2 2 | Mexico|Indonesia 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_4.txt: -------------------------------------------------------------------------------- 1 | tagClass|country 2 | MusicalArtist|Burma 3 | -------------------------------------------------------------------------------- /neo4j/load_scripts/show-db-size.sh: -------------------------------------------------------------------------------- 1 | . ./path.sh 2 | du -sh $NEO4J_DB_DIR 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_12.txt: -------------------------------------------------------------------------------- 1 | date|likeThreshold 2 | 2012-05-01 00:00:00|400 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/IC_1.txt: -------------------------------------------------------------------------------- 1 | personId|firstName 2 | 30786325583618|Carmen 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/IC_6.txt: -------------------------------------------------------------------------------- 1 | personId|tagClass 2 | 30786325583618|Angola 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_10.txt: -------------------------------------------------------------------------------- 1 | tag|date 2 | John_Rhys-Davies|1970-10-26 02:30:06 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_21.txt: -------------------------------------------------------------------------------- 1 | country|endDate 2 | Ethiopia|2012-05-01 00:00:00 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/IC_13.txt: -------------------------------------------------------------------------------- 1 | person1Id|person2Id 2 | 8796093030404|26388279074461 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/IC_14.txt: -------------------------------------------------------------------------------- 1 | person1Id|person2Id 2 | 8796093030404|26388279074461 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/IC_2.txt: -------------------------------------------------------------------------------- 1 | personId|maxDate 2 | 17592186052613|2012-05-01 00:00:00 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/IC_5.txt: -------------------------------------------------------------------------------- 1 | personId|minDate 2 | 17592186055119|2012-05-01 00:00:00 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/IC_9.txt: -------------------------------------------------------------------------------- 1 | personId|maxDate 2 | 13194139542834|2012-05-24 00:30:33 3 | -------------------------------------------------------------------------------- /neo4j/load_scripts/restart-neo4j.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | $NEO4J_HOME/bin/neo4j restart 4 | -------------------------------------------------------------------------------- /preview.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNSW-database/GraphDB-Benchmark/HEAD/preview.pdf -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_14.txt: -------------------------------------------------------------------------------- 1 | startDate|endDate 2 | 2012-05-01 00:00:00|2012-06-04 17:20:00 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/IC_12.txt: -------------------------------------------------------------------------------- 1 | personId|tagClassName 2 | 17592186052613|BasketballPlayer 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_11.txt: -------------------------------------------------------------------------------- 1 | country|blackList 2 | Germany|also;Pope;that;James;Henry;one;Green 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_18.txt: -------------------------------------------------------------------------------- 1 | date|lengthThreshold|languages 2 | 1970-10-26 02:30:06|1000|ar 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_19.txt: -------------------------------------------------------------------------------- 1 | date|tagClass1|tagClass2 2 | 1970-01-01|MusicalArtist|OfficeHolder 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/IC_11.txt: -------------------------------------------------------------------------------- 1 | personId|countryName|workFromYear 2 | 30786325583618|Laos|2010 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_9.txt: -------------------------------------------------------------------------------- 1 | tagClass1|tagClass2|threshold 2 | BaseballPlayer|ChristianBishop|200 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/IC_4.txt: -------------------------------------------------------------------------------- 1 | personId|startDate|durationDays 2 | 21990232559429|2012-05-01 00:00:00|37 3 | -------------------------------------------------------------------------------- /agens/load_scripts/path.sh: -------------------------------------------------------------------------------- 1 | export AGENS_DATA_DIR=/data/datasets/DG1/social_network 2 | export POSTFIX=_0_0.csv 3 | -------------------------------------------------------------------------------- /neo4j/load_scripts/delete-neo4j-database.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | $NEO4J_HOME/bin/neo4j stop 4 | rm -rf $NEO4J_DB_DIR 5 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_2.txt: -------------------------------------------------------------------------------- 1 | startDate|endDate|country1Name|country2Name 2 | 2008-03-18 00:80:53|2012-05-24 00:30:33|Spain|Germany 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/IC_3.txt: -------------------------------------------------------------------------------- 1 | personId|startDate|duration|countryX|countryY 2 | 17592186055119|2012-05-01 00:00:00|42|Laos|Scotland 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_16.txt: -------------------------------------------------------------------------------- 1 | personId|country|tagClass|minPathDistance|maxPathDistance 2 | 19791209310731|Pakistan|MusicalArtist|3|5 3 | -------------------------------------------------------------------------------- /seeds/seeds_macro/BI_25.txt: -------------------------------------------------------------------------------- 1 | person1Id|person2Id|startDate|endDate 2 | 21990232557814|28587302324583|2012-04-01 00:00:00|2012-05-01 00:00:00 3 | -------------------------------------------------------------------------------- /agens/run_ch.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | SEED_PATH=$2 5 | 6 | for((i=1;i<=8;i++)) 7 | do 8 | python run_ch.py $DB $SEED_PATH $i > result/ch_$i.out 9 | done 10 | -------------------------------------------------------------------------------- /agens/run_ic.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | SEED_PATH=$2 5 | 6 | for((i=1;i<=14;i++)) 7 | do 8 | python run_ic.py $DB $SEED_PATH $i > result/ic_$i.out 9 | done 10 | -------------------------------------------------------------------------------- /agens/run_id.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | SEED_PATH=$2 5 | 6 | for((i=1;i<=8;i++)) 7 | do 8 | python run_id.py $DB $SEED_PATH $i > result/id_$i.out 9 | done 10 | -------------------------------------------------------------------------------- /agens/run_ii.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | SEED_PATH=$2 5 | 6 | for((i=1;i<=8;i++)) 7 | do 8 | python run_ii.py $DB $SEED_PATH $i > result/ii_$i.out 9 | done 10 | -------------------------------------------------------------------------------- /agens/run_is.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | SEED_PATH=$2 5 | 6 | for((i=1;i<=7;i++)) 7 | do 8 | python run_is.py $DB $SEED_PATH $i > result/is_$i.out 9 | done 10 | -------------------------------------------------------------------------------- /light/run_ch.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | SEED_PATH=$2 5 | 6 | for((i=1;i<=8;i++)) 7 | do 8 | python run_ch.py $DB $SEED_PATH $i > result/ch_$i.out 9 | done 10 | -------------------------------------------------------------------------------- /light/run_id.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | SEED_PATH=$2 5 | 6 | for((i=1;i<=8;i++)) 7 | do 8 | python run_id.py $DB $SEED_PATH $i > result/id_$i.out 9 | done 10 | -------------------------------------------------------------------------------- /light/run_ii.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | SEED_PATH=$2 5 | 6 | for((i=1;i<=8;i++)) 7 | do 8 | python run_ii.py $DB $SEED_PATH $i > result/ii_$i.out 9 | done 10 | -------------------------------------------------------------------------------- /light/run_is.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | SEED_PATH=$2 5 | 6 | for((i=1;i<=7;i++)) 7 | do 8 | python run_is.py $DB $SEED_PATH $i > result/is_$i.out 9 | done 10 | -------------------------------------------------------------------------------- /neo4j/run_bi.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | SEED_PATH=$2 5 | 6 | for((i=1;i<=25;i++)) 7 | do 8 | python run_bi.py $DB $SEED_PATH $i > result/bi_$i.out 9 | done 10 | -------------------------------------------------------------------------------- /neo4j/run_ch.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | SEED_PATH=$2 5 | 6 | for((i=1;i<=8;i++)) 7 | do 8 | python run_ch.py $DB $SEED_PATH $i > result/ch_$i.out 9 | done 10 | -------------------------------------------------------------------------------- /neo4j/run_ic.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | SEED_PATH=$2 5 | 6 | for((i=1;i<=14;i++)) 7 | do 8 | python run_ic.py $DB $SEED_PATH $i > result/ic_$i.out 9 | done 10 | -------------------------------------------------------------------------------- /neo4j/run_id.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | SEED_PATH=$2 5 | 6 | for((i=1;i<=8;i++)) 7 | do 8 | python run_id.py $DB $SEED_PATH $i > result/id_$i.out 9 | done 10 | -------------------------------------------------------------------------------- /neo4j/run_ii.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | SEED_PATH=$2 5 | 6 | for((i=1;i<=8;i++)) 7 | do 8 | python run_ii.py $DB $SEED_PATH $i > result/ii_$i.out 9 | done 10 | -------------------------------------------------------------------------------- /neo4j/run_is.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | SEED_PATH=$2 5 | 6 | for((i=1;i<=7;i++)) 7 | do 8 | python run_is.py $DB $SEED_PATH $i > result/is_$i.out 9 | done 10 | -------------------------------------------------------------------------------- /tiger/queries/interactive_insert/id_6.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY id_6(VERTEX postId) FOR GRAPH ldbc_snb { 2 | 3 | vPost = { postId }; 4 | 5 | DELETE p FROM vPost:p; 6 | 7 | } -------------------------------------------------------------------------------- /tiger/queries/interactive_insert/id_4.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY id_4(VERTEX forumId) FOR GRAPH ldbc_snb { 2 | 3 | vForum = { forumId }; 4 | 5 | DELETE f FROM vForum:f; 6 | 7 | } -------------------------------------------------------------------------------- /tiger/queries/interactive_insert/id_1.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY id_1(VERTEX personId) FOR GRAPH ldbc_snb { 2 | 3 | vPerson = { personId }; 4 | 5 | DELETE p FROM vPerson:p; 6 | 7 | } -------------------------------------------------------------------------------- /tiger/queries/interactive_insert/id_7.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY id_7(VERTEX commentId) FOR GRAPH ldbc_snb { 2 | 3 | vComment = { commentId }; 4 | 5 | DELETE c FROM vComment:c; 6 | 7 | } -------------------------------------------------------------------------------- /light/load_scripts/path.sh: -------------------------------------------------------------------------------- 1 | export LIGHT_DATA_DIR=/root/data/DG1/social_network/ 2 | export POSTFIX=_0_0.csv 3 | export LGRAPH_DB_DIR=/root/path/to/stored/graph/ 4 | export LIC_DIR=/root/path/to/license/fma.lic -------------------------------------------------------------------------------- /light/run_micro_all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | MICRO_SEED_PATH=$2 5 | 6 | ./run_ii.sh $DB $MICRO_SEED_PATH 7 | ./run_is.sh $DB $MICRO_SEED_PATH 8 | ./run_ch.sh $DB $MICRO_SEED_PATH 9 | ./run_id.sh $DB $MICRO_SEED_PATH 10 | -------------------------------------------------------------------------------- /neo4j/load_scripts/path.sh: -------------------------------------------------------------------------------- 1 | 2 | export NEO4J_HOME=/data/database/Neo4j/neo4j-community-3.5.14 3 | export NEO4J_DATA_DIR=/data/datasets/SF1/neo4j_convert 4 | export NEO4J_DB_DIR=$NEO4J_HOME/data/databases/graph.db 5 | export POSTFIX=_0_0.csv 6 | -------------------------------------------------------------------------------- /tiger/queries/interactive_insert/ii_5.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ii_5(UINT personId, UINT forumId, DATETIME joinDate) FOR GRAPH ldbc_snb { 2 | INSERT INTO Forum_HAS_MEMBER_Person (FROM, TO, joinDate) VALUES (forumId Forum, personId Person, joinDate); 3 | } -------------------------------------------------------------------------------- /tiger/queries/interactive_insert/ii_2.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ii_2(UINT personId, UINT postId, DATETIME creationDate) FOR GRAPH ldbc_snb { 2 | INSERT INTO Person_LIKES_Post (FROM, TO, creationDate) VALUES (personId Person, postId Post, creationDate); 3 | } 4 | -------------------------------------------------------------------------------- /tiger/queries/interactive_insert/id_2.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY id_2(VERTEX personId, VERTEX postId) FOR GRAPH ldbc_snb { 2 | 3 | vPerson = { personId }; 4 | DELETE e FROM vPerson:s -(Person_LIKES_Post:e)-> Post:t 5 | WHERE t == postId; 6 | } 7 | -------------------------------------------------------------------------------- /tiger/queries/interactive_insert/ii_3.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ii_3(UINT personId, UINT commentId, DATETIME creationDate) FOR GRAPH ldbc_snb { 2 | INSERT INTO Person_LIKES_Comment (FROM, TO, creationDate) VALUES (personId Person, commentId Comment, creationDate); 3 | } -------------------------------------------------------------------------------- /tiger/queries/interactive_insert/ii_8.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ii_8(UINT personId, UINT person2Id, DATETIME creationDate) FOR GRAPH ldbc_snb { 2 | INSERT INTO Person_KNOWS_Person (FROM, TO, creationDate) VALUES (personId Person, person2Id Person, creationDate); 3 | } 4 | -------------------------------------------------------------------------------- /tiger/queries/interactive_insert/id_5.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY id_5(VERTEX forumId, VERTEX personId) FOR GRAPH ldbc_snb { 2 | 3 | vForum = { forumId }; 4 | DELETE e FROM vForum:s -(Forum_HAS_MEMBER_Person:e)-> Person:t 5 | WHERE t == personId; 6 | } 7 | -------------------------------------------------------------------------------- /tiger/queries/interactive_insert/id_3.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY id_3(VERTEX personId, VERTEX commentId) FOR GRAPH ldbc_snb { 2 | 3 | vPerson = { personId }; 4 | DELETE e FROM vPerson:s -(Person_LIKES_Comment:e)-> Comment:t 5 | WHERE t == commentId; 6 | } 7 | -------------------------------------------------------------------------------- /tiger/queries/interactive_insert/id_8.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY id_8(VERTEX personId, VERTEX person2Id) FOR GRAPH ldbc_snb { 2 | 3 | vPerson = { personId }; 4 | DELETE e FROM vPerson:s -(Person_KNOWS_Person:e)-> Person:t 5 | WHERE t == person2Id; 6 | } 7 | -------------------------------------------------------------------------------- /tiger/load_scripts/path.sh: -------------------------------------------------------------------------------- 1 | 2 | ### change to raw data file folder 3 | export LDBC_SNB_DATA_DIR=/home/tigergraph/ldbc_snb_data/social_network/ 4 | ### somehow LDBC SNB datagen doesn't get any benefit from multithreads. fix it to the single file for each vertex/edge 5 | export LDBC_SNB_DATA_POSTFIX=_0_0.csv 6 | -------------------------------------------------------------------------------- /agens/run_all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | MICRO_SEED_PATH=$2 5 | MACRO_SEED_PATH=$3 6 | 7 | ./run_ii.sh $DB $MICRO_SEED_PATH 8 | ./run_is.sh $DB $MICRO_SEED_PATH 9 | ./run_ch.sh $DB $MICRO_SEED_PATH 10 | ./run_id.sh $DB $MICRO_SEED_PATH 11 | 12 | ./run_ic.sh $DB $MACRO_SEED_PATH 13 | ./run_bi.sh $DB $MACRO_SEED_PATH 14 | -------------------------------------------------------------------------------- /neo4j/run_all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | MICRO_SEED_PATH=$2 5 | MACRO_SEED_PATH=$3 6 | 7 | ./run_ii.sh $DB $MICRO_SEED_PATH 8 | ./run_is.sh $DB $MICRO_SEED_PATH 9 | ./run_ch.sh $DB $MICRO_SEED_PATH 10 | ./run_id.sh $DB $MICRO_SEED_PATH 11 | 12 | ./run_ic.sh $DB $MACRO_SEED_PATH 13 | ./run_bi.sh $DB $MACRO_SEED_PATH 14 | -------------------------------------------------------------------------------- /agens/run_bi.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | SEED_PATH=$2 5 | 6 | for((i=1;i<=18;i++)) 7 | do 8 | python run_bi.py $DB $SEED_PATH $i > result/bi_$i.out 9 | done 10 | 11 | for((i=20;i<=25;i++)) 12 | do 13 | python run_bi.py $DB $SEED_PATH $i > result/bi_$i.out 14 | done 15 | 16 | python run_bi.py $DB $SEED_PATH 19 > result/bi_19.out -------------------------------------------------------------------------------- /neo4j/load_scripts/load-in-one-step.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #export NEO4J_HOME=/home/zhiyi/ecosys/neo4j-community-3.5.0 3 | #export NEO4J_DATA_DIR=/home/zhiyi/raw/snb/neo4j/social_network-1000 4 | #export NEO4J_DB_DIR=$NEO4J_HOME/data/databases/snb-1000.db 5 | #export POSTFIX=_0_0.csv 6 | 7 | . ./path.sh 8 | 9 | ./delete-neo4j-database.sh && ./convert-data.sh && ./import-to-neo4j.sh && ./restart-neo4j.sh 10 | 11 | ./show-db-size.sh 12 | -------------------------------------------------------------------------------- /tiger/queries/helper/to_jsonarray.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY to_jsonarray(SET src) FOR GRAPH ldbc_snb RETURNS(JSONARRAY) { 2 | BOOL needComma = False; 3 | STRING jsonStr = "["; 4 | 5 | FOREACH s IN src DO 6 | IF needComma THEN 7 | jsonStr = jsonStr + ","; 8 | ELSE 9 | needComma = True; 10 | END; 11 | jsonStr = jsonStr + "\"" + s + "\""; 12 | END; 13 | jsonStr = jsonStr + "]"; 14 | 15 | RETURN parse_json_array(jsonStr); 16 | } -------------------------------------------------------------------------------- /neo4j/load_scripts/index_time.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | . ./path.sh 3 | 4 | grep -n -r 'Index population started' $NEO4J_HOME/logs/debug.log > index-t0.out 5 | sed -i 's/[^0-9]//g' index-t0.out 6 | sed -i 's/^...//g' index-t0.out 7 | sed -i 's/......$//g' index-t0.out 8 | 9 | grep -n -r 'Index creation finished' $NEO4J_HOME/logs/debug.log > index-tn.out 10 | sed -i 's/[^0-9]//g' index-tn.out 11 | sed -i 's/^...//g' index-tn.out 12 | sed -i 's/......$//g' index-tn.out 13 | -------------------------------------------------------------------------------- /tiger/run_all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DB=$1 4 | MICRO_SEED_PATH=$2 5 | MACRO_SEED_PATH=$3 6 | 7 | python driver_new.py -p $MICRO_SEED_PATH -n 3 -q ii -d 1 > result/i_insert_$DB 8 | python driver_new.py -p $MICRO_SEED_PATH -n 3 -q is -d 1 > result/i_short_$DB 9 | python driver_new.py -p $MICRO_SEED_PATH -n 3 -q id -d 1 > result/i_delete_$DB 10 | 11 | python driver_new.py -p $MACRO_SEED_PATH -n 3 -q ic -d 1 > result/i_complex_$DB 12 | python driver_new.py -p $MACRO_SEED_PATH -n 3 -q bi -d 1 > result/business_i_$DB 13 | -------------------------------------------------------------------------------- /tiger/queries/helper/get_messages_from_person.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY get_messages_from_person(VERTEX seed, INT numMessages) FOR GRAPH ldbc_snb { 2 | ListAccum @@messagesLiked; 3 | 4 | vPerson = {seed}; 5 | vMessage = 6 | SELECT t 7 | FROM vPerson:s-((Person_LIKES_Comment|Person_LIKES_Post):e)->(Comment|Post):t 8 | ORDER BY t.id 9 | LIMIT numMessages; 10 | 11 | tmp = 12 | SELECT v 13 | FROM vMessage:v 14 | ACCUM @@messagesLiked += v.id; 15 | 16 | PRINT @@messagesLiked as message_ids; 17 | } -------------------------------------------------------------------------------- /tiger/queries/interactive_insert/ii_4.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ii_4(UINT forumId, STRING forumTitle, DATETIME creationDate, UINT moderatorPersonId, set tagIds) FOR GRAPH ldbc_snb { 2 | 3 | INSERT INTO Forum (PRIMARY_ID, id, title, creationDate) VALUES (forumId, forumId, forumTitle, creationDate); 4 | 5 | INSERT INTO Forum_HAS_MODERATOR_Person (FROM, TO) VALUES (forumId Forum, moderatorPersonId Person); 6 | 7 | FOREACH tagId IN tagIds DO 8 | INSERT INTO Forum_HAS_TAG_Tag (FROM, TO) VALUES (forumId Forum, tagId Tag); 9 | END; 10 | } 11 | -------------------------------------------------------------------------------- /params.ini: -------------------------------------------------------------------------------- 1 | ldbc.snb.datagen.generator.scaleFactor:snb.interactive.1 2 | 3 | ldbc.snb.datagen.serializer.dynamicActivitySerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.activity.CsvCompositeDynamicActivitySerializer 4 | ldbc.snb.datagen.serializer.dynamicPersonSerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.person.CsvCompositeDynamicPersonSerializer 5 | ldbc.snb.datagen.serializer.staticSerializer:ldbc.snb.datagen.serializer.snb.csv.staticserializer.CsvCompositeStaticSerializer 6 | 7 | ldbc.snb.datagen.generator.numThreads:32 8 | -------------------------------------------------------------------------------- /light/load_scripts/lgraph_server.json: -------------------------------------------------------------------------------- 1 | { 2 | "license" : "./fma.lic", 3 | "directory" : "./lgraph_db", 4 | 5 | "host" : "0.0.0.0", 6 | "port" : 7071, 7 | "enable_ha" : false, 8 | 9 | "enable_rpc" : true, 10 | "rpc_port" : 9090, 11 | 12 | "verbose" : 1, 13 | "log_file" : "/var/log/lgraph.log", 14 | 15 | "ssl_auth" : false, 16 | "server_key" : "/usr/local/etc/lgraph/server-key.pem", 17 | "server_cert" : "/usr/local/etc/lgraph/server-cert.pem", 18 | "web" : "/usr/local/share/lgraph/resource", 19 | 20 | "n_python_workers" : 1 21 | } -------------------------------------------------------------------------------- /neo4j/load_scripts/drop-index-ldbc.cql: -------------------------------------------------------------------------------- 1 | DROP INDEX ON :Message(id); 2 | DROP INDEX ON :Comment(id); 3 | DROP INDEX ON :Forum(id); 4 | DROP INDEX ON :Organisation(id); 5 | DROP INDEX ON :Person(id); 6 | DROP INDEX ON :Place(name); 7 | DROP INDEX ON :Post(id); 8 | DROP INDEX ON :Tag(name); 9 | DROP INDEX ON :TagClass(name); 10 | DROP INDEX ON :Message(creationDate); 11 | DROP INDEX ON :Comment(creationDate); 12 | DROP INDEX ON :Post(creationDate); 13 | DROP INDEX ON :Forum(creationDate); 14 | DROP INDEX ON :Person(firstName); 15 | -------------------------------------------------------------------------------- /neo4j/load_scripts/index-ldbc.cql: -------------------------------------------------------------------------------- 1 | CREATE INDEX ON :Message(id); 2 | CREATE INDEX ON :Comment(id); 3 | CREATE INDEX ON :Forum(id); 4 | CREATE INDEX ON :Organisation(id); 5 | CREATE INDEX ON :Person(id); 6 | CREATE INDEX ON :Place(name); 7 | CREATE INDEX ON :Post(id); 8 | CREATE INDEX ON :Tag(name); 9 | CREATE INDEX ON :TagClass(name); 10 | CREATE INDEX ON :Message(creationDate); 11 | CREATE INDEX ON :Comment(creationDate); 12 | CREATE INDEX ON :Post(creationDate); 13 | CREATE INDEX ON :Forum(creationDate); 14 | CREATE INDEX ON :Person(firstName); 15 | -------------------------------------------------------------------------------- /tiger/queries/interactive_short/is_3.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY is_3(VERTEX personId) FOR GRAPH ldbc_snb { 2 | SumAccum @creationDate; 3 | 4 | vPerson = { personId }; 5 | vFriend = 6 | SELECT t 7 | FROM vPerson:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t 8 | ACCUM t.@creationDate += datetime_to_epoch(e.creationDate) 9 | ORDER BY t.@creationDate DESC, t.id; 10 | 11 | PRINT vFriend[ 12 | vFriend.id AS personId, 13 | vFriend.firstName AS firstName, 14 | vFriend.lastName AS lastName, 15 | epoch_to_datetime(vFriend.@creationDate) AS friendshipCreationDate]; 16 | } -------------------------------------------------------------------------------- /tiger/queries/interactive_short/is_1.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY is_1(VERTEX personId) FOR GRAPH ldbc_snb { 2 | SumAccum @cityId; 3 | 4 | vPerson = { personId }; 5 | vPerson = 6 | SELECT s 7 | FROM vPerson:s-(Person_IS_LOCATED_IN_City:e)->City:t 8 | ACCUM s.@cityId = t.id; 9 | 10 | PRINT vPerson[ 11 | vPerson.firstName AS firstName, 12 | vPerson.lastName AS lastName, 13 | vPerson.birthday AS birthday, 14 | vPerson.locationIP AS locationIP, 15 | vPerson.browserUsed AS browserUsed, 16 | vPerson.@cityId AS cityId, 17 | vPerson.gender AS gender, 18 | vPerson.creationDate AS creationDate]; 19 | } -------------------------------------------------------------------------------- /tiger/queries/interactive_short/is_5.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY is_5(STRING messageId) FOR GRAPH ldbc_snb { 2 | SetAccum @@seed; 3 | 4 | @@seed += messageId; 5 | vComments = to_vertex_set(@@seed, "Comment"); 6 | 7 | IF vComments.size() > 0 THEN 8 | vPerson = 9 | SELECT t 10 | FROM vComments:s-(Comment_HAS_CREATOR_Person:e)->Person:t; 11 | ELSE 12 | vPost = to_vertex_set(@@seed, "Post"); 13 | vPerson = 14 | SELECT t 15 | FROM vPost:s-(Post_HAS_CREATOR_Person:e)->Person:t; 16 | END; 17 | 18 | PRINT vPerson[ 19 | vPerson.id AS personId, 20 | vPerson.firstName AS firstName, 21 | vPerson.lastName AS lastName]; 22 | } -------------------------------------------------------------------------------- /light/load_scripts/convert_data.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 4 | ## convert each date of format yyyy-mm-dd to a number of format yyyymmddd 5 | sed -i "s#|\([0-9][0-9][0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]\)|#|\1\2\3|#g" "${LIGHT_DATA_DIR}/person${POSTFIX}" 6 | # 7 | ## convert each datetime of format yyyy-mm-ddThh:mm:ss.mmm+0000 8 | ## to a number of format yyyymmddhhmmssmmm 9 | sed -i "s#|\([0-9][0-9][0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]\)T\([0-9][0-9]\):\([0-9][0-9]\):\([0-9][0-9]\)\.\([0-9][0-9][0-9]\)+0000#|\1\2\3\4\5\6\7#g" ${LIGHT_DATA_DIR}/*${POSTFIX} 10 | 11 | sed -i '1d' ${LIGHT_DATA_DIR}/*${POSTFIX} 12 | sed -i "s/,/+/g" ${LIGHT_DATA_DIR}/*${POSTFIX} 13 | sed -i "s/|/,/g" ${LIGHT_DATA_DIR}/*${POSTFIX} 14 | -------------------------------------------------------------------------------- /agens/load_scripts/reindex.sql: -------------------------------------------------------------------------------- 1 | SET graph_path = ldbc_graph; 2 | REINDEX VLABEL Forum; 3 | REINDEX VLABEL Message; 4 | REINDEX VLABEL Post; 5 | REINDEX VLABEL Comment; 6 | REINDEX VLABEL Organisation; 7 | REINDEX VLABEL Person; 8 | REINDEX VLABEL Place; 9 | REINDEX VLABEL Tag; 10 | REINDEX VLABEL TagClass; 11 | REINDEX ELABEL HAS_CREATOR ; 12 | REINDEX ELABEL IS_LOCATED_IN ; 13 | REINDEX ELABEL REPLY_OF ; 14 | REINDEX ELABEL CONTAINER_OF ; 15 | REINDEX ELABEL HAS_MEMBER ; 16 | REINDEX ELABEL HAS_MODERATOR ; 17 | REINDEX ELABEL HAS_TAG ; 18 | REINDEX ELABEL HAS_INTEREST ; 19 | REINDEX ELABEL KNOWS ; 20 | REINDEX ELABEL LIKES ; 21 | REINDEX ELABEL IS_PART_OF ; 22 | REINDEX ELABEL IS_SUBCLASS_OF ; 23 | REINDEX ELABEL HAS_TYPE ; 24 | REINDEX ELABEL STUDY_AT ; 25 | REINDEX ELABEL WORK_AT ; 26 | -------------------------------------------------------------------------------- /tiger/load_scripts/one_step_load.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ############################################################ 4 | # Copyright (c) 2015-now, TigerGraph Inc. 5 | # All rights reserved 6 | # It is provided as it is for benchmark reproducible purpose. 7 | # anyone can use it for benchmark purpose with the 8 | # acknowledgement to TigerGraph. 9 | # Author: Litong Shen litong.shen@tigergraph.com 10 | ############################################################ 11 | 12 | ### change to raw data file folder 13 | #export LDBC_SNB_DATA_DIR=/home/tigergraph/ldbc_snb_data/social_network/ 14 | ### somehow LDBC SNB datagen doesn't get any benefit from multithreads. fix it to the single file for each vertex/edge 15 | #export LDBC_SNB_DATA_POSTFIX=_0_0.csv 16 | 17 | # define schema and loading job 18 | gadmin start 19 | gsql setup_schema.gsql 20 | 21 | # load data into TigerGraph 22 | ./load_data.sh 23 | -------------------------------------------------------------------------------- /tiger/queries/interactive_short/is_4.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY is_4(STRING messageId) FOR GRAPH ldbc_snb { 2 | SetAccum @@seed; 3 | SumAccum @messageContent; 4 | 5 | @@seed += messageId; 6 | vComments = to_vertex_set(@@seed, "Comment"); 7 | 8 | IF vComments.size() > 0 THEN 9 | PRINT vComments[ 10 | vComments.creationDate AS messageCreationDate, 11 | vComments.content AS messageContent]; 12 | ELSE 13 | vPost = to_vertex_set(@@seed, "Post"); 14 | vPost = 15 | SELECT v 16 | FROM vPost:v 17 | ACCUM 18 | CASE 19 | WHEN v.content != "" THEN 20 | v.@messageContent += v.content 21 | ELSE 22 | v.@messageContent += v.imageFile 23 | END; 24 | 25 | PRINT vPost[ 26 | vPost.creationDate AS messageCreationDate, 27 | vPost.@messageContent AS messageContent]; 28 | END; 29 | } 30 | -------------------------------------------------------------------------------- /agens/load_scripts/create_vertex_indexes.sql: -------------------------------------------------------------------------------- 1 | SET graph_path = ldbc_graph; 2 | CREATE UNIQUE PROPERTY INDEX ON Forum (id); 3 | CREATE UNIQUE PROPERTY INDEX ON Message (id); 4 | CREATE UNIQUE PROPERTY INDEX ON Post (id); 5 | CREATE UNIQUE PROPERTY INDEX ON Comment (id); 6 | CREATE UNIQUE PROPERTY INDEX ON Organisation (id); 7 | CREATE UNIQUE PROPERTY INDEX ON Person (id); 8 | CREATE UNIQUE PROPERTY INDEX ON Place (id); 9 | CREATE UNIQUE PROPERTY INDEX ON Tag (id); 10 | CREATE UNIQUE PROPERTY INDEX ON TagClass (id); 11 | CREATE PROPERTY INDEX ON Message ( creationDate); 12 | CREATE PROPERTY INDEX ON Post ( creationDate); 13 | CREATE PROPERTY INDEX ON Comment ( creationDate); 14 | CREATE PROPERTY INDEX ON Forum ( creationDate); 15 | CREATE PROPERTY INDEX ON Person (firstName); 16 | CREATE PROPERTY INDEX ON Place (name); 17 | CREATE PROPERTY INDEX ON Tag (name); 18 | CREATE PROPERTY INDEX ON TagClass (name); 19 | -------------------------------------------------------------------------------- /tiger/queries/interactive_insert/ii_7.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ii_7(UINT commentId, DATETIME creationDate, STRING locationIP, STRING browserUsed, STRING content, UINT length, UINT authorPersonId, UINT countryId, INT replyToPostId, INT replyToCommentId, set tagIds) FOR GRAPH ldbc_snb { 2 | 3 | INSERT INTO Comment (PRIMARY_ID, id, creationDate, locationIP, browserUsed, content, length) VALUES (commentId, commentId, creationDate, locationIP, browserUsed, content, length); 4 | 5 | INSERT INTO Comment_HAS_CREATOR_Person (FROM, TO) VALUES (commentId Comment, authorPersonId Person); 6 | 7 | IF replyToPostId != -1 THEN 8 | INSERT INTO Comment_REPLY_OF_Post (FROM, TO) VALUES (commentId Comment, replyToPostId Post); 9 | ELSE 10 | INSERT INTO Comment_REPLY_OF_Comment (FROM, TO) VALUES (commentId Comment, replyToCommentId Comment); 11 | END; 12 | 13 | INSERT INTO Comment_IS_LOCATED_IN_Country (FROM, TO) VALUES (commentId Comment, countryId Country); 14 | 15 | FOREACH tagId IN tagIds DO 16 | INSERT INTO Comment_HAS_TAG_Tag (FROM, TO) VALUES (commentId Comment, tagId Tag); 17 | END; 18 | } 19 | -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_12.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_12(DATETIME minDate, INT likeThreshold) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE msg; 3 | 4 | SumAccum @creatorFirstName, @creatorLastName; 5 | SumAccum @likeCount; 6 | HeapAccum(100, likeCount DESC, messageId ASC) @@trendingMsg; 7 | 8 | vMessage = { Comment.*, Post.* }; 9 | vMessage = 10 | SELECT s 11 | FROM vMessage:s-((Comment_HAS_CREATOR_Person|Post_HAS_CREATOR_Person):e)->Person:t 12 | WHERE s.creationDate > minDate 13 | ACCUM 14 | s.@creatorFirstName = t.firstName, 15 | s.@creatorLastName = t.lastName; 16 | 17 | vMessage = 18 | SELECT s 19 | FROM vMessage:s-((Person_LIKES_Comment_REVERSE|Person_LIKES_Post_REVERSE):e)->Person:t 20 | ACCUM s.@likeCount += 1 21 | POST-ACCUM 22 | IF s.@likeCount > likeThreshold THEN 23 | @@trendingMsg += msg(s.id, s.creationDate, s.@creatorFirstName, s.@creatorLastName, s.@likeCount) 24 | END; 25 | 26 | PRINT @@trendingMsg; 27 | } 28 | -------------------------------------------------------------------------------- /agens/load_scripts/agens-clean.sql: -------------------------------------------------------------------------------- 1 | DROP GRAPH ldbc_graph CASCADE; 2 | DROP FOREIGN TABLE nw_comment, nw_forum, nw_organisation, 3 | nw_person, nw_place, nw_post, 4 | nw_tag, nw_tagclass, 5 | nw_comment_hascreator_person, 6 | nw_comment_hastag_tag, 7 | nw_comment_islocatedin_place, 8 | nw_comment_replyof_comment, 9 | nw_comment_replyof_post, 10 | nw_forum_containerof_post, 11 | nw_forum_hasmember_person, 12 | nw_forum_hasmoderator_person, 13 | nw_forum_hastag_tag, 14 | nw_organisation_islocatedin_place, 15 | nw_person_hasinterest_tag, 16 | nw_person_islocatedin_place, 17 | nw_person_knows_person, 18 | nw_person_likes_comment, 19 | nw_person_likes_post, 20 | nw_person_studyat_organisation, 21 | nw_person_workat_organisation, 22 | nw_place_ispartof_place, 23 | nw_post_hascreator_person, 24 | nw_post_hastag_tag, 25 | nw_post_islocatedin_place, 26 | nw_tagclass_issubclassof_tagclass, 27 | nw_tag_hastype_tagclass; 28 | DROP SERVER ldbc; 29 | -------------------------------------------------------------------------------- /tiger/queries/interactive_complex/ic_2.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ic_2(VERTEX personId, DATETIME maxDate) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE msg; 3 | 4 | HeapAccum(20, messageCreationDate DESC, messageId ASC) @@msgTop; 5 | 6 | vPerson = { personId }; 7 | vFriend = 8 | SELECT t 9 | FROM vPerson:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t; 10 | 11 | vMessage = 12 | SELECT t 13 | FROM vFriend:s-((Comment_HAS_CREATOR_Person_REVERSE|Post_HAS_CREATOR_Person_REVERSE):e)->(Comment|Post):t 14 | WHERE t.creationDate < maxDate 15 | ACCUM 16 | CASE 17 | WHEN t.type == "Comment" THEN 18 | @@msgTop += msg(s.id, s.firstName, s.lastName, t.id, t.content, t.creationDate) 19 | WHEN t.type == "Post" AND t.content != "" THEN 20 | @@msgTop += msg(s.id, s.firstName, s.lastName, t.id, t.content, t.creationDate) 21 | 22 | ELSE 23 | @@msgTop += msg(s.id, s.firstName, s.lastName, t.id, t.imageFile, t.creationDate) 24 | END; 25 | 26 | PRINT @@msgTop; 27 | } 28 | -------------------------------------------------------------------------------- /agens/load_scripts/data-convert.sh: -------------------------------------------------------------------------------- 1 | # replace headers 2 | while read line; do 3 | IFS=' ' read -r -a array <<< $line 4 | filename=${array[0]} 5 | header=${array[1]} 6 | sed -i "1s/.*/$header/" ${AGENS_DATA_DIR}/${filename}${POSTFIX} 7 | done < headers.txt 8 | 9 | ## replace labels with one starting with an uppercase letter 10 | sed -i "s/|city$/|City/" ${AGENS_DATA_DIR}/place${POSTFIX} 11 | sed -i "s/|country$/|Country/" ${AGENS_DATA_DIR}/place${POSTFIX} 12 | sed -i "s/|continent$/|Continent/" ${AGENS_DATA_DIR}/place${POSTFIX} 13 | sed -i "s/|company|/|Company|/" ${AGENS_DATA_DIR}/organisation${POSTFIX} 14 | sed -i "s/|university|/|University|/" ${AGENS_DATA_DIR}/organisation${POSTFIX} 15 | 16 | ## convert each date of format yyyy-mm-dd to a number of format yyyymmddd 17 | sed -i "s#|\([0-9][0-9][0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]\)|#|\1\2\3|#g" "${AGENS_DATA_DIR}/person${POSTFIX}" 18 | 19 | ## convert each datetime of format yyyy-mm-ddThh:mm:ss.mmm+0000 20 | ## to a number of format yyyymmddhhmmssmmm 21 | sed -i "s#|\([0-9][0-9][0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]\)T\([0-9][0-9]\):\([0-9][0-9]\):\([0-9][0-9]\)\.\([0-9][0-9][0-9]\)+0000#|\1\2\3\4\5\6\7#g" ${AGENS_DATA_DIR}/*${POSTFIX} 22 | -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_23.gsql: -------------------------------------------------------------------------------- 1 | # Holiday destinations 2 | CREATE QUERY bi_23(STRING countryName) FOR GRAPH ldbc_snb { 3 | TYPEDEF TUPLE INFO; 4 | 5 | HeapAccum(100, messageCount DESC, destinationName ASC, mon ASC) @@result; 6 | GroupByAccum messageCount> @@count; 7 | 8 | vStart(ANY) = {Country.*}; 9 | vCities = 10 | SELECT t 11 | FROM vStart:s-(City_IS_PART_OF_Country_REVERSE:e)->City:t 12 | WHERE s.name == countryName; 13 | 14 | vPerson = 15 | SELECT t 16 | FROM vCities:s-(Person_IS_LOCATED_IN_City_REVERSE:e)->Person:t; 17 | 18 | vMessages = 19 | SELECT t 20 | FROM vPerson:s-((Comment_HAS_CREATOR_Person_REVERSE|Post_HAS_CREATOR_Person_REVERSE):e)->:t; 21 | 22 | vMessages = 23 | SELECT s 24 | FROM vMessages:s-((Post_IS_LOCATED_IN_Country|Comment_IS_LOCATED_IN_Country):e)->Country:t 25 | WHERE t.name != countryName 26 | ACCUM @@count += (month(s.creationDate), t.name -> 1); 27 | 28 | FOREACH c IN @@count DO 29 | @@result += INFO(c.messageCount, c.destinationName, c.mon); 30 | END; 31 | 32 | PRINT @@result; 33 | } -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_8.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_8(STRING tagName) FOR GRAPH ldbc_snb { 2 | SumAccum @count; 3 | OrAccum @valid = false; 4 | //SetAccum @@invalidComment; 5 | 6 | vTag = { Tag.* }; 7 | vTag = 8 | SELECT s 9 | FROM vTag:s 10 | WHERE s.name == tagName; 11 | 12 | vMessages = 13 | SELECT t 14 | FROM vTag:s-((Comment_HAS_TAG_Tag_REVERSE|Post_HAS_TAG_Tag_REVERSE):e)->:t; 15 | 16 | vComments = 17 | SELECT t 18 | FROM vMessages:s-((Comment_REPLY_OF_Post_REVERSE|Comment_REPLY_OF_Comment_REVERSE):e)->:t; 19 | 20 | tmp = 21 | SELECT t 22 | FROM vComments:s-(Comment_HAS_TAG_Tag:e)->Tag:t 23 | WHERE t.name == tagName 24 | ACCUM s.@valid = true; 25 | //ACCUM @@invalidComment += s.id; 26 | 27 | vRelatedTags = 28 | SELECT t 29 | FROM vComments:s-(Comment_HAS_TAG_Tag:e)->:t 30 | WHERE NOT s.@valid 31 | //WHERE NOT @@invalidComment.contains(s.id) 32 | ACCUM t.@count += 1 # no duplicated names for tags 33 | ORDER BY t.@count DESC, t.name ASC 34 | LIMIT 100; 35 | 36 | PRINT vRelatedTags[ 37 | vRelatedTags.name AS relatedTagName, 38 | vRelatedTags.@count AS replyCount]; 39 | } 40 | -------------------------------------------------------------------------------- /tiger/queries/interactive_short/is_6.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY is_6(STRING messageId) FOR GRAPH ldbc_snb { 2 | SumAccum @forumId; 3 | SumAccum @forumTitle; 4 | SetAccum @@seed; 5 | 6 | BOOL isPost = False; 7 | 8 | @@seed += messageId; 9 | vMessage = to_vertex_set(@@seed, "Comment"); 10 | 11 | IF vMessage.size() == 0 THEN 12 | vMessage = to_vertex_set(@@seed, "Post"); 13 | isPost = True; 14 | END; 15 | 16 | WHILE isPost == False DO 17 | vMessage = 18 | SELECT t 19 | FROM vMessage:s-((Comment_REPLY_OF_Comment|Comment_REPLY_OF_Post):e)->(Comment|Post):t 20 | ACCUM CASE WHEN t.type == "Post" THEN isPost = True END; 21 | END; 22 | 23 | vForum = 24 | SELECT t 25 | FROM vMessage:s-(Forum_CONTAINER_OF_Post_REVERSE:e)->Forum:t; 26 | 27 | vModerator = 28 | SELECT t 29 | FROM vForum:s-(Forum_HAS_MODERATOR_Person:e)->Person:t 30 | ACCUM t.@forumId = s.id, t.@forumTitle = s.title; 31 | 32 | PRINT vModerator[ 33 | vModerator.@forumId AS forumId, 34 | vModerator.@forumTitle AS forumTitle, 35 | vModerator.id AS moderatorId, 36 | vModerator.firstName AS moderatorFirstName, 37 | vModerator.lastName AS moderatorLastName]; 38 | } -------------------------------------------------------------------------------- /neo4j/load_scripts/convert-data.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # replace headers 4 | while read line; do 5 | IFS=' ' read -r -a array <<< $line 6 | filename=${array[0]} 7 | header=${array[1]} 8 | sed -i "1s/.*/$header/" "${NEO4J_DATA_DIR}/${filename}${POSTFIX}" 9 | done < headers.txt 10 | 11 | ## replace labels with one starting with an uppercase letter 12 | sed -i "s/|city$/|City/" "${NEO4J_DATA_DIR}/place${POSTFIX}" 13 | sed -i "s/|country$/|Country/" "${NEO4J_DATA_DIR}/place${POSTFIX}" 14 | sed -i "s/|continent$/|Continent/" "${NEO4J_DATA_DIR}/place${POSTFIX}" 15 | sed -i "s/|company|/|Company|/" "${NEO4J_DATA_DIR}/organisation${POSTFIX}" 16 | sed -i "s/|university|/|University|/" "${NEO4J_DATA_DIR}/organisation${POSTFIX}" 17 | # 18 | ## convert each date of format yyyy-mm-dd to a number of format yyyymmddd 19 | sed -i "s#|\([0-9][0-9][0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]\)|#|\1\2\3|#g" "${NEO4J_DATA_DIR}/person${POSTFIX}" 20 | # 21 | ## convert each datetime of format yyyy-mm-ddThh:mm:ss.mmm+0000 22 | ## to a number of format yyyymmddhhmmssmmm 23 | sed -i "s#|\([0-9][0-9][0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]\)T\([0-9][0-9]\):\([0-9][0-9]\):\([0-9][0-9]\)\.\([0-9][0-9][0-9]\)+0000#|\1\2\3\4\5\6\7#g" ${NEO4J_DATA_DIR}/*${POSTFIX} 24 | -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_3.gsql: -------------------------------------------------------------------------------- 1 | # Tag evolution 2 | CREATE QUERY bi_3(INT year1, INT month1) FOR GRAPH ldbc_snb { 3 | TYPEDEF TUPLE TAG_COUNT; 4 | 5 | GroupByAccum countMonth1, SumAccum countMonth2> @@count; 6 | HeapAccum(100, diff DESC, tagName ASC) @@result; 7 | 8 | INT year2, month2; 9 | year2 = year1 + (month1 / 12); 10 | month2 = 1 + month1 % 12; 11 | 12 | vMessages = { Post.*, Comment.* }; 13 | vMessages = 14 | SELECT s 15 | FROM vMessages:s 16 | WHERE (year(s.creationDate) == year1 AND month(s.creationDate) == month1) 17 | OR (year(s.creationDate) == year2 AND month(s.creationDate) == month2); 18 | 19 | vMessages = 20 | SELECT s 21 | FROM vMessages:s-(:e)->Tag:t 22 | ACCUM 23 | IF year(s.creationDate) == year1 AND month(s.creationDate) == month1 THEN 24 | @@count += (t.name -> 1, 0) 25 | ELSE 26 | @@count += (t.name -> 0, 1) 27 | END; 28 | 29 | FOREACH c IN @@count DO 30 | @@result += TAG_COUNT(c.tagName, c.countMonth1, c.countMonth2, abs(c.countMonth1 - c.countMonth2)); 31 | END; 32 | 33 | PRINT @@result; 34 | } -------------------------------------------------------------------------------- /tiger/queries/interactive_insert/ii_1.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ii_1(UINT personId, STRING personFirstName, STRING personLastName, STRING gender, DATETIME birthday, DATETIME creationDate, STRING locationIP, STRING browserUsed, UINT cityId, set languages, set emails , set tagIds, set studyAt, set workAt) FOR GRAPH ldbc_snb { 2 | 3 | INSERT INTO Person (PRIMARY_ID, id, firstName, lastName, gender, birthday, creationDate, locationIP, browserUsed, speaks, email) VALUES (personId, personId, personFirstName, personLastName, gender, birthday, creationDate, locationIP, browserUsed, languages, emails); 4 | 5 | INSERT INTO Person_IS_LOCATED_IN_City (FROM, TO) VALUES (personId Person, cityId City); 6 | 7 | FOREACH tagId IN tagIds DO 8 | INSERT INTO Person_HAS_INTEREST_Tag (FROM, TO) VALUES (personId Person, tagId Tag); 9 | END; 10 | 11 | #INT lenSA = studyAt.size(); 12 | FOREACH sid IN studyAt DO 13 | INSERT INTO Person_STUDY_AT_University (FROM, TO, classYear) VALUES (personId Person, sid University, _); 14 | END; 15 | 16 | #INT lenWA = workAt.size(), 17 | FOREACH wid IN workAt DO 18 | INSERT INTO Person_WORK_AT_Company (FROM, TO, workFrom) VALUES (personId Person, wid Company, _); 19 | END; 20 | 21 | } -------------------------------------------------------------------------------- /tiger/queries/interactive_complex/ic_8.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ic_8(VERTEX personId) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE v, DATETIME commentCreationDate, INT commentId> reply; 3 | TYPEDEF tuple replier; 4 | 5 | SetAccum> @@replies; 6 | HeapAccum(20, commentCreationDate DESC, commentId ASC) @@replyTop; 7 | HeapAccum(20, commentCreationDate DESC, commentId ASC) @@replierTop; 8 | 9 | vPerson = { personId }; 10 | vMessage = 11 | SELECT t 12 | FROM vPerson:s-((Comment_HAS_CREATOR_Person_REVERSE|Post_HAS_CREATOR_Person_REVERSE):e)->(Comment|Post):t; 13 | 14 | vReply = 15 | SELECT t 16 | FROM vMessage:s-((Comment_REPLY_OF_Comment_REVERSE|Comment_REPLY_OF_Post_REVERSE):e)->Comment:t 17 | POST-ACCUM @@replyTop += reply(t, t.creationDate, t.id); 18 | 19 | FOREACH r IN @@replyTop DO 20 | @@replies += r.v; 21 | END; 22 | 23 | vReply = { @@replies }; 24 | vReply = 25 | SELECT s 26 | FROM vReply:s-(Comment_HAS_CREATOR_Person:e)->Person:t 27 | ACCUM @@replierTop += replier(t.id, t.firstName, t.lastName, s.creationDate, s.id, s.content); 28 | 29 | PRINT @@replierTop; 30 | } -------------------------------------------------------------------------------- /agens/weight_precal.sql: -------------------------------------------------------------------------------- 1 | -- pre_eval weights 2 | set graph_path = ldbc_graph; 3 | DROP TABLE IF EXISTS c14_weight; 4 | CREATE UNLOGGED TABLE c14_weight(p1 bigint, p2 bigint, weight double precision); 5 | INSERT INTO c14_weight 6 | SELECT (p1->>0)::bigint, (p2->>0)::bigint, SUM((inc->>0)::float) FROM ( 7 | SELECT 8 | rep_creator AS p1, 9 | org_creator AS p2, 10 | inc 11 | FROM 12 | ( 13 | MATCH 14 | (p1:Person)<-[:HAS_CREATOR]-(c:Comment)-[:REPLY_OF]->(m:Post)-[:HAS_CREATOR]->(p2:Person) 15 | , (p1:Person)-[:KNOWS]->(p2:Person) 16 | RETURN p1.id AS rep_creator, p2.id AS org_creator, 1.0 AS inc 17 | UNION ALL 18 | MATCH 19 | (p1:Person)<-[:HAS_CREATOR]-(m:Post)<-[:REPLY_OF]-(c:Comment)-[:HAS_CREATOR]->(p2:Person) 20 | , (p1:Person)-[:KNOWS]->(p2:Person) 21 | RETURN p1.id AS rep_creator, p2.id AS org_creator, 1.0 AS inc 22 | UNION ALL 23 | MATCH 24 | (p1:Person)-[:HAS_CREATOR]-(c:Comment)-[:REPLY_OF]-(m:Comment)-[:HAS_CREATOR]-(p2:Person) 25 | , (p1:Person)-[:KNOWS]->(p2:Person) 26 | RETURN p1.id AS rep_creator, p2.id AS org_creator, 0.5 AS inc 27 | ) AS x 28 | ) AS x 29 | GROUP BY p1, p2; 30 | CREATE UNIQUE INDEX ON c14_weight(p1, p2); 31 | ALTER TABLE c14_weight SET LOGGED; 32 | -------------------------------------------------------------------------------- /tiger/queries/interactive_complex/ic_4.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ic_4(VERTEX personId, DATETIME startDate, INT durationDays) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE topic; 3 | 4 | SumAccum @pId, @postCount; 5 | SetAccum> @@tagsFav, @@tagsExc; 6 | HeapAccum(10, postCount DESC, tagName ASC) @@topicTop; 7 | 8 | DATETIME endDate; 9 | 10 | vPerson = { personId }; 11 | vFriend = 12 | SELECT t 13 | FROM vPerson:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t; 14 | 15 | vPost = 16 | SELECT t 17 | FROM vFriend:s-(Post_HAS_CREATOR_Person_REVERSE:e)->Post:t 18 | ACCUM t.@pId = s.id; 19 | 20 | endDate = DATETIME_add(startDate, INTERVAL durationDays DAY); 21 | 22 | vTag = 23 | SELECT t 24 | FROM vPost:s-(Post_HAS_TAG_Tag:e)->Tag:t 25 | ACCUM 26 | CASE 27 | WHEN s.creationDate BETWEEN startDate AND endDate THEN 28 | t.@postCount += 1 29 | WHEN s.creationDate < startDate THEN 30 | @@tagsExc += t 31 | END 32 | POST-ACCUM CASE WHEN t.@postCount > 0 THEN @@tagsFav += t END; 33 | 34 | @@tagsFav = @@tagsFav MINUS @@tagsExc; 35 | vTag = { @@tagsFav }; 36 | vTag = 37 | SELECT v 38 | FROM vTag:v 39 | ACCUM @@topicTop += topic(v.name, v.@postCount); 40 | 41 | PRINT @@topicTop; 42 | } -------------------------------------------------------------------------------- /tiger/queries/interactive_complex/ic_6.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ic_6(VERTEX personId, STRING tagName) FOR GRAPH ldbc_snb { 2 | TYPEDEF tuple tagStats; 3 | 4 | OrAccum @visited; 5 | ListAccum> @@friendAll; 6 | ListAccum> @@postAll; 7 | SumAccum @postCount; 8 | HeapAccum(10, postCount DESC, tagName ASC) @@tagStatsTop; 9 | 10 | INT i = 0; 11 | 12 | vPerson = { personId }; 13 | WHILE i < 2 DO 14 | vPerson = 15 | SELECT t 16 | FROM vPerson:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t 17 | WHERE t.@visited == False 18 | ACCUM 19 | s.@visited += True, 20 | t.@visited += True, 21 | @@friendAll += t; 22 | 23 | i = i + 1; 24 | END; 25 | 26 | vFriend = { @@friendAll }; 27 | vPost = 28 | SELECT t 29 | FROM vFriend:s-(Post_HAS_CREATOR_Person_REVERSE:e)->Post:t; 30 | 31 | vPost = 32 | SELECT s 33 | FROM vPost:s-(Post_HAS_TAG_Tag:e)->Tag:t 34 | ACCUM CASE WHEN t.name == tagName THEN @@postAll += s END; 35 | 36 | vPost = { @@postAll }; 37 | vTag = 38 | SELECT t 39 | FROM vPost:s-(Post_HAS_TAG_Tag:e)->Tag:t 40 | ACCUM CASE WHEN t.name != tagName THEN t.@postCount += 1 END 41 | POST-ACCUM @@tagStatsTop += tagStats(t.name, t.@postCount); 42 | 43 | PRINT @@tagStatsTop; 44 | } 45 | -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_20.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_20(SET tagClassNames) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE INFO; 3 | 4 | HeapAccum(200, messageCount DESC, tagClassName ASC) @@result; 5 | SumAccum @tagClassName; 6 | MapAccum @@count; 7 | SetAccum @visitedTagClass; 8 | 9 | vTagClass = { TagClass.* }; 10 | vTagClass = 11 | SELECT s 12 | FROM vTagClass:s 13 | WHERE s.name IN tagClassNames 14 | ACCUM s.@tagClassName = s.name; 15 | 16 | vTags = {}; 17 | WHILE (vTagClass.size() > 0) DO 18 | tmp = 19 | SELECT t 20 | FROM vTagClass:s-(Tag_HAS_TYPE_TagClass_REVERSE:e)->:t 21 | ACCUM t.@tagClassName = s.@tagClassName; 22 | 23 | vTags = vTags UNION tmp; 24 | 25 | vTagClass = 26 | SELECT t 27 | FROM vTagClass:s-(TagClass_IS_SUBCLASS_OF_TagClass_REVERSE:e)->:t 28 | ACCUM t.@tagClassName = s.@tagClassName; 29 | END; 30 | 31 | vMessages = 32 | SELECT t 33 | FROM vTags:s-((Comment_HAS_TAG_Tag_REVERSE|Post_HAS_TAG_Tag_REVERSE):e)->:t 34 | ACCUM t.@visitedTagClass += s.@tagClassName 35 | POST-ACCUM 36 | FOREACH i IN t.@visitedTagClass DO 37 | @@count += (i -> 1) 38 | END; 39 | 40 | FOREACH (key, value) IN @@count DO 41 | @@result += INFO(key, value); 42 | END; 43 | 44 | PRINT @@result; 45 | } 46 | -------------------------------------------------------------------------------- /tiger/queries/interactive_complex/ic_5.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ic_5(VERTEX personId, DATETIME minDate) FOR GRAPH ldbc_snb { 2 | OrAccum @visited; 3 | SetAccum> @@friendAll; 4 | SetAccum @member; 5 | SumAccum @creator; 6 | SetAccum @post; 7 | 8 | INT i = 0; 9 | vPerson = { personId }; 10 | WHILE i < 2 DO 11 | vPerson = 12 | SELECT t 13 | FROM vPerson:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t 14 | WHERE t.@visited == False 15 | ACCUM 16 | s.@visited += True, 17 | t.@visited += True, 18 | @@friendAll += t; 19 | i = i + 1; 20 | END; 21 | 22 | vFriends = { @@friendAll }; 23 | vForum = 24 | SELECT t 25 | FROM vFriends:s-(Forum_HAS_MEMBER_Person_REVERSE:e)->Forum:t 26 | WHERE e.joinDate > minDate 27 | ACCUM t.@member += s.id; 28 | 29 | vPost = 30 | SELECT t 31 | FROM vForum:s-(Forum_CONTAINER_OF_Post:e)->Post:t; 32 | 33 | vPost = 34 | SELECT s 35 | FROM vPost:s-(Post_HAS_CREATOR_Person:e)->Person:t 36 | ACCUM s.@creator = t.id; 37 | 38 | vPost = 39 | SELECT t 40 | FROM vForum:s-(Forum_CONTAINER_OF_Post:e)->Post:t 41 | WHERE t.@creator IN s.@member 42 | ACCUM s.@post += t.id; 43 | 44 | vForum = 45 | SELECT s 46 | FROM vForum:s 47 | ORDER BY s.@post.size() DESC, s.id ASC 48 | LIMIT 20; 49 | 50 | PRINT vForum[vForum.title AS title, vForum.@post.size() AS postCount]; 51 | } 52 | -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_14.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_14(DATETIME startDate, DATETIME endDate) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE initiator; 3 | 4 | SumAccum @personId; 5 | SumAccum @threadCount; 6 | MapAccum @@initiatorGroup; 7 | HeapAccum(100, messageCount DESC, personId ASC) @@initiatorTop; 8 | 9 | vPost = { Post.* }; 10 | vPost = 11 | SELECT v 12 | FROM vPost:v 13 | WHERE v.creationDate BETWEEN startDate AND endDate; 14 | 15 | vPerson = 16 | SELECT t 17 | FROM vPost:s-(Post_HAS_CREATOR_Person:e)->Person:t 18 | ACCUM 19 | t.@threadCount += 1, 20 | s.@personId = t.id, 21 | @@initiatorGroup += (t.id -> 1); 22 | 23 | vMessage(Comment|Post) = vPost; 24 | WHILE vMessage.size() > 0 DO 25 | vMessage = 26 | SELECT t 27 | FROM vMessage:s-((Comment_REPLY_OF_Comment_REVERSE|Comment_REPLY_OF_Post_REVERSE):e)->Comment:t 28 | ACCUM 29 | t.@personId = s.@personId, 30 | CASE 31 | WHEN t.creationDate BETWEEN startDate AND endDate THEN 32 | @@initiatorGroup += (s.@personId -> 1) 33 | END; 34 | END; 35 | 36 | vPerson = 37 | SELECT v 38 | FROM vPerson:v 39 | ACCUM @@initiatorTop += initiator(v.id, v.firstName, v.lastName, v.@threadCount, @@initiatorGroup.get(v.id)); 40 | 41 | PRINT @@initiatorTop; 42 | } -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_1.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_1(DATETIME maxDate) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE MessageInfo; 3 | 4 | HeapAccum(1, theYear DESC, isComment ASC, lengthCategory ASC) @@result; 5 | OrAccum @isComment; 6 | SumAccum @lengthCategory; 7 | GroupByAccum messageCount, SumAccum sumMessageLength> @@calc; 8 | 9 | INT total; 10 | 11 | vStart = { Post.*, Comment.* }; 12 | vStart = 13 | SELECT s 14 | FROM vStart:s 15 | WHERE s.creationDate < maxDate 16 | ACCUM 17 | s.@isComment = (s.type == "Comment"), 18 | IF s.length < 40 THEN 19 | s.@lengthCategory = "0" 20 | ELSE IF s.length < 80 THEN 21 | s.@lengthCategory = "1" 22 | ELSE IF s.length < 160 THEN 23 | s.@lengthCategory = "2" 24 | ELSE 25 | s.@lengthCategory = "3" 26 | END 27 | POST-ACCUM @@calc += (year(s.creationDate), s.@isComment, s.@lengthCategory -> 1, s.length); 28 | 29 | total = vStart.size(); 30 | @@result.resize(total); 31 | FOREACH c IN @@calc DO 32 | @@result += MessageInfo(c.theYear, c.isComment, c.lengthCategory, c.messageCount, (c.sumMessageLength / c.messageCount), c.sumMessageLength, (c.messageCount * 1.0 / total)); 33 | END; 34 | 35 | PRINT @@result; 36 | } -------------------------------------------------------------------------------- /tiger/queries/interactive_complex/ic_11.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ic_11(VERTEX personId, STRING countryName, INT workFromYear) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE friendInfo; 3 | 4 | ListAccum> @@friendAll; 5 | OrAccum @visited; 6 | OrAccum @locatedInGivenCountry; 7 | HeapAccum(10, organizationWorkFromYear ASC, personId ASC, organizationName DESC) @@friendInfoTop; 8 | 9 | INT i; 10 | 11 | vPerson = { personId }; 12 | WHILE i < 2 DO 13 | vPerson = 14 | SELECT t 15 | FROM vPerson:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t 16 | WHERE t.@visited == False 17 | ACCUM 18 | s.@visited += True, 19 | t.@visited += True, 20 | @@friendAll += t; 21 | 22 | i = i + 1; 23 | END; 24 | 25 | vCompany = { Company.* }; 26 | findCompanyInGivenCountry = 27 | SELECT t 28 | FROM vCompany:s-(Company_IS_LOCATED_IN_Country:e)->Country:t 29 | WHERE t.name == countryName 30 | ACCUM s.@locatedInGivenCountry += True; 31 | 32 | vFriend = { @@friendAll }; 33 | aggFriend = 34 | SELECT t 35 | FROM vFriend:s-(Person_WORK_AT_Company:e)->Company:t 36 | WHERE e.workFrom < workFromYear 37 | AND t.@locatedInGivenCountry == True 38 | ACCUM @@friendInfoTop += friendInfo(s.id, s.firstName, s.lastName, t.name, e.workFrom); 39 | 40 | PRINT @@friendInfoTop; 41 | } 42 | -------------------------------------------------------------------------------- /agens/load_scripts/headers.txt: -------------------------------------------------------------------------------- 1 | comment id|creationDate|locationIP|browserUsed|content|length 2 | forum id|title|creationDate 3 | organisation id|label|name|url 4 | person id|firstName|lastName|gender|birthday|creationDate|locationIP|browserUsed|languages|emails 5 | place id|name|url|label 6 | post id|imageFile|creationDdate|locationIP|browserUsed|languages|content|length 7 | tagclass id|name|url 8 | tag id|name|url 9 | comment_hasCreator_person CommentId|PersonId 10 | comment_isLocatedIn_place CommentId|PlaceId 11 | comment_replyOf_comment CommentId|CommentId2 12 | comment_replyOf_post CommentId|PostId 13 | forum_containerOf_post ForumId|PostId 14 | forum_hasMember_person ForumId|PersonId|joinDate 15 | forum_hasModerator_person ForumId|PersonId 16 | forum_hasTag_tag ForumId|TagId 17 | person_hasInterest_tag PersonId|TagId 18 | person_isLocatedIn_place PersonId|PlaceId 19 | person_knows_person PersonId|PersonId2|creationDate 20 | person_likes_comment PersonId|CommentId|creationDate 21 | person_likes_post PersonId|PostId|creationDate 22 | person_studyAt_organisation PersonId|OrganisationId|classYear 23 | person_workAt_organisation PersonId|OrganisationId|workFrom 24 | place_isPartOf_place PlaceId|PlaceId2 25 | post_hasCreator_person PostId|PersonId 26 | comment_hasTag_tag CommentId|TagId 27 | post_hasTag_tag PostId|TagId 28 | post_isLocatedIn_place PostId|PlaceId 29 | tagclass_isSubclassOf_tagclass TagClassId|TagClassId2 30 | tag_hasType_tagclass TagId|TagClassId 31 | organisation_isLocatedIn_place OrganisationId|PlaceId 32 | -------------------------------------------------------------------------------- /tiger/queries/interactive_complex/ic_9.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ic_9(VERTEX personId, DATETIME maxDate) FOR GRAPH ldbc_snb { 2 | TYPEDEF tuple msgInfo; 3 | 4 | OrAccum @visited; 5 | SetAccum> @@friendAll; 6 | HeapAccum(20, messageCreationDate DESC, messageId ASC) @@msgInfoTop; 7 | 8 | INT i = 0; 9 | 10 | vPerson = { personId }; 11 | WHILE i < 2 DO 12 | vPerson = 13 | SELECT t 14 | FROM vPerson:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t 15 | WHERE t.@visited == False 16 | ACCUM 17 | s.@visited += True, 18 | t.@visited += True, 19 | @@friendAll += t; 20 | 21 | i = i + 1; 22 | END; 23 | 24 | vFriend = { @@friendAll }; 25 | vMessage = 26 | SELECT t 27 | FROM vFriend:s-((Comment_HAS_CREATOR_Person_REVERSE|Post_HAS_CREATOR_Person_REVERSE):e)->(Comment|Post):t 28 | WHERE t.creationDate < maxDate 29 | ACCUM 30 | CASE 31 | WHEN t.type == "Comment" THEN 32 | @@msgInfoTop += msgInfo(s.id, s.firstName, s.lastName, t.id, t.content, t.creationDate) 33 | WHEN t.type == "Post" AND t.content != "" THEN 34 | @@msgInfoTop += msgInfo(s.id, s.firstName, s.lastName, t.id, t.content, t.creationDate) 35 | ELSE 36 | @@msgInfoTop += msgInfo(s.id, s.firstName, s.lastName, t.id, t.imageFile, t.creationDate) 37 | END; 38 | 39 | PRINT @@msgInfoTop; 40 | } 41 | -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_10.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_10(STRING tagName, DATETIME minDate) FOR GRAPH ldbc_snb { 2 | OrAccum @isInterested; 3 | OrAccum @hasTag; 4 | SumAccum @score; 5 | SumAccum @friendScore; 6 | SetAccum> @@personSet; 7 | 8 | vTag = { Tag.* }; 9 | vTag = 10 | SELECT v 11 | FROM vTag:v 12 | WHERE v.name == tagName; 13 | 14 | vPerson1 = 15 | SELECT t 16 | FROM vTag:s-(Person_HAS_INTEREST_Tag_REVERSE:e)->Person:t 17 | ACCUM t.@isInterested = TRUE, 18 | @@personSet += t, 19 | t.@score += 100; 20 | 21 | vMessage = 22 | SELECT t 23 | FROM vTag:s-((Post_HAS_TAG_Tag_REVERSE|Comment_HAS_TAG_Tag_REVERSE):e)->(Post|Comment):t 24 | WHERE t.creationDate > minDate 25 | ACCUM t.@hasTag = TRUE; 26 | 27 | vPerson2 = 28 | SELECT t 29 | FROM vMessage:s-((Post_HAS_CREATOR_Person|Comment_HAS_CREATOR_Person):e)->Person:t 30 | ACCUM @@personSet += t; 31 | 32 | vPerson = { @@personSet }; 33 | 34 | vPerson = 35 | SELECT s 36 | FROM vPerson:s-((Post_HAS_CREATOR_Person_REVERSE|Comment_HAS_CREATOR_Person_REVERSE):e)->(Post|Comment):t 37 | WHERE t.@hasTag 38 | ACCUM s.@score += 1; 39 | 40 | vFriend = 41 | SELECT t 42 | FROM vPerson:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t 43 | ACCUM s.@friendScore += t.@score; 44 | 45 | res = 46 | SELECT s 47 | FROM vPerson:s 48 | ORDER BY s.@score+s.@friendScore DESC, s.id ASC 49 | LIMIT 100; 50 | 51 | PRINT res[res.id AS id, res.@score AS score, res.@friendScore AS friendScore]; 52 | } 53 | -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_15.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_15(STRING countryName) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE socialNormalPerson; 3 | 4 | SetAccum> @@personInCountry; 5 | SumAccum @@numFriendsAll; 6 | SumAccum @numFriends; 7 | HeapAccum(100, personId ASC) @@socialNormalPersonTop; 8 | 9 | INT socialNormal = 0; 10 | 11 | vCountry = { Country.* }; 12 | vCity = 13 | SELECT t 14 | FROM vCountry:s-(City_IS_PART_OF_Country_REVERSE:e)->City:t 15 | WHERE s.name == countryName; 16 | 17 | vPerson = 18 | SELECT t 19 | FROM vCity:s-(Person_IS_LOCATED_IN_City_REVERSE:e)->Person:t 20 | POST-ACCUM @@personInCountry += t; 21 | 22 | // phase 1. calculate social normal, i.e. floor(avg(#friends)) 23 | vFriend = 24 | SELECT t 25 | FROM vPerson:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t 26 | WHERE @@personInCountry.contains(t) 27 | ACCUM @@numFriendsAll += 1; 28 | 29 | socialNormal = floor(@@numFriendsAll / @@personInCountry.size()); 30 | 31 | // phase 2. find persons in Country, whose # friends in Country == socialNormal 32 | vPerson = { @@personInCountry }; 33 | vPerson = 34 | SELECT s 35 | FROM vPerson:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t 36 | WHERE @@personInCountry.contains(t) 37 | ACCUM s.@numFriends += 1 38 | POST-ACCUM 39 | CASE 40 | WHEN s.@numFriends == socialNormal THEN 41 | @@socialNormalPersonTop += socialNormalPerson(s.id, s.@numFriends) 42 | END; 43 | 44 | PRINT @@socialNormalPersonTop; 45 | } -------------------------------------------------------------------------------- /tiger/queries/interactive_insert/ii_6.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ii_6(UINT postId, STRING imageFile, DATETIME creationDate, STRING locationIP, STRING browserUsed, STRING language, STRING content, UINT length, UINT authorPersonId, UINT forumId, UINT countryId, set tagIds) FOR GRAPH ldbc_snb { 2 | 3 | IF content == "" THEN 4 | IF imageFile == "" THEN 5 | INSERT INTO Post (PRIMARY_ID, id, creationDate, locationIP, browserUsed, lang, length) VALUES (postId, postId, creationDate, locationIP, browserUsed, language, length); 6 | ELSE 7 | INSERT INTO Post (PRIMARY_ID, id, imageFile, creationDate, locationIP, browserUsed, lang, length) VALUES (postId, postId, imageFile, creationDate, locationIP, browserUsed, language, length); 8 | END; 9 | ELSE 10 | IF imageFile == "" THEN 11 | INSERT INTO Post (PRIMARY_ID, id, creationDate, locationIP, browserUsed, lang, content, length) VALUES (postId, postId, creationDate, locationIP, browserUsed, language, content, length); 12 | ELSE 13 | INSERT INTO Post (PRIMARY_ID, id, imageFile, creationDate, locationIP, browserUsed, lang, content, length) VALUES (postId, postId, imageFile, creationDate, locationIP, browserUsed, language, content, length); 14 | END; 15 | END; 16 | 17 | INSERT INTO Post_HAS_CREATOR_Person (FROM, TO) VALUES (postId Post, authorPersonId Person); 18 | 19 | INSERT INTO Forum_CONTAINER_OF_Post (FROM, TO) VALUES (forumId Forum, postId Post); 20 | 21 | INSERT INTO Post_IS_LOCATED_IN_Country (FROM, TO) VALUES (postId Post, countryId Country); 22 | 23 | FOREACH tagId IN tagIds DO 24 | INSERT INTO Post_HAS_TAG_Tag (FROM, TO) VALUES (postId Post, tagId Tag); 25 | END; 26 | } -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_17.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_17(STRING countryName) FOR GRAPH ldbc_snb { 2 | SumAccum @@cnt; 3 | SumAccum @country; 4 | MapAccum> @@preLevel0; 5 | MapAccum> @@preLevel; 6 | MapAccum> @@preLevel2; 7 | 8 | vStart(ANY) = {Country.*}; 9 | vStart = 10 | SELECT s 11 | FROM vStart:s 12 | WHERE s.name == countryName; 13 | 14 | vCities = 15 | SELECT t 16 | FROM vStart:s-(City_IS_PART_OF_Country_REVERSE:e)->City:t; 17 | 18 | vPerson = 19 | SELECT t 20 | FROM vCities:s-(Person_IS_LOCATED_IN_City_REVERSE:e)->Person:t 21 | ACCUM t.@country = countryName; 22 | 23 | vLevel2 = 24 | SELECT t 25 | FROM vPerson:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t 26 | WHERE t.id > s.id AND t.@country == countryName 27 | ACCUM @@preLevel += (t.id -> s.id); 28 | 29 | vLevel3 = 30 | SELECT t 31 | FROM vLevel2:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t 32 | WHERE t.id > s.id AND t.@country == countryName 33 | ACCUM @@preLevel2 += (t.id -> s.id); 34 | 35 | vLevel0 = 36 | SELECT s 37 | FROM vPerson:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t 38 | WHERE s.id < t.id AND t.@country == countryName 39 | ACCUM @@preLevel0 += (s.id -> t.id); 40 | 41 | res = 42 | SELECT s 43 | FROM vLevel3:s 44 | ACCUM 45 | FOREACH ver IN @@preLevel2.get(s.id) DO 46 | FOREACH ver2 IN @@preLevel.get(ver) DO 47 | IF @@preLevel0.get(ver2).contains(s.id) THEN 48 | @@cnt += 1 49 | END 50 | END 51 | END; 52 | 53 | PRINT @@cnt AS count_triangles; 54 | } 55 | -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_4.gsql: -------------------------------------------------------------------------------- 1 | # Popular topics in a Country 2 | CREATE QUERY bi_4(STRING tagClassName, STRING countryName) FOR GRAPH ldbc_snb { 3 | TYPEDEF TUPLE INFO; 4 | 5 | GroupByAccum postCount> @@count; 6 | HeapAccum(20, postCount DESC, forumId ASC) @@result; 7 | OrAccum @visited; 8 | SumAccum @personId; 9 | 10 | vStart(ANY) = { Country.* }; 11 | vStart = SELECT s 12 | FROM vStart:s 13 | WHERE s.name == countryName; 14 | 15 | vStart = SELECT t 16 | FROM vStart:s-(City_IS_PART_OF_Country_REVERSE:e)->:t; 17 | 18 | vStart = 19 | SELECT t 20 | FROM vStart:s-(Person_IS_LOCATED_IN_City_REVERSE:e)->:t; 21 | 22 | vForum = 23 | SELECT t 24 | FROM vStart:s-(Forum_HAS_MODERATOR_Person_REVERSE:e)->:t 25 | ACCUM 26 | t.@personId = s.id, # one Forum can only have one moderator 27 | t.@visited = TRUE; 28 | 29 | vStart = { TagClass.* }; 30 | vStart = 31 | SELECT s 32 | FROM vStart:s 33 | WHERE s.name == tagClassName; 34 | 35 | vStart = 36 | SELECT t 37 | FROM vStart:s-(Tag_HAS_TYPE_TagClass_REVERSE:e)->:t; 38 | 39 | vStart = 40 | SELECT t 41 | FROM vStart:s-(Post_HAS_TAG_Tag_REVERSE:e)->:t; 42 | 43 | vForum = 44 | SELECT t 45 | FROM vStart:s-(Forum_CONTAINER_OF_Post_REVERSE:e)->:t 46 | WHERE t.@visited == TRUE 47 | ACCUM @@count += (t.id, t.title, t.creationDate, t.@personId -> 1); 48 | 49 | FOREACH c IN @@count DO 50 | @@result += INFO(c.forumId, c.forumTitle, c.forumCreationDate, c.personId, c.postCount); 51 | END; 52 | 53 | PRINT @@result; 54 | } 55 | -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_24.gsql: -------------------------------------------------------------------------------- 1 | # Messages by Topic and Continent 2 | CREATE QUERY bi_24(STRING tagClassName) FOR GRAPH ldbc_snb { 3 | TYPEDEF TUPLE info; 4 | 5 | HeapAccum(100, year ASC, month ASC, continentName DESC) @@result; 6 | GroupByAccum messageCount, SumAccum likeCount> @@count; 7 | SumAccum @continentName; 8 | SumAccum @likeCount; 9 | 10 | vTagClass = { TagClass.* }; 11 | vTags = 12 | SELECT t 13 | FROM vTagClass:s-(Tag_HAS_TYPE_TagClass_REVERSE:e)->:t 14 | WHERE s.name == tagClassName; 15 | 16 | vMessages = 17 | SELECT t 18 | FROM vTags:s-((Comment_HAS_TAG_Tag_REVERSE|Post_HAS_TAG_Tag_REVERSE):e)->:t; 19 | 20 | # count likes 21 | calcLikeCount = 22 | SELECT s 23 | FROM vMessages:s-((Person_LIKES_Post_REVERSE|Person_LIKES_Comment_REVERSE):e)->:t 24 | ACCUM s.@likeCount += 1; 25 | 26 | # get Continent name 27 | vCountries = 28 | SELECT t 29 | FROM vMessages:s-((Post_IS_LOCATED_IN_Country|Comment_IS_LOCATED_IN_Country):e)->:t; 30 | 31 | vCountries = 32 | SELECT s 33 | FROM vCountries:s-(Country_IS_PART_OF_Continent:e)->:t 34 | ACCUM s.@continentName = t.name; 35 | 36 | # get name and count 37 | vMessages = 38 | SELECT s 39 | FROM vMessages:s-((Post_IS_LOCATED_IN_Country|Comment_IS_LOCATED_IN_Country):e)->:t 40 | ACCUM s.@continentName = t.@continentName 41 | POST-ACCUM @@count += (year(s.creationDate), month(s.creationDate), s.@continentName -> 1, s.@likeCount); 42 | 43 | FOREACH c IN @@count DO 44 | @@result += info(c.messageCount, c.likeCount, c.year, c.month, c.continentName); 45 | END; 46 | 47 | PRINT @@result; 48 | } -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_13.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_13(STRING countryName) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE tagInfo; 3 | TYPEDEF TUPLE tagStats; 4 | 5 | GroupByAccum popularity> tagGroup> @@monthlyGroup; 6 | HeapAccum(5, popularity DESC, tag_name ASC) @@tagInfoTop; 7 | HeapAccum(100, year DESC, month ASC) @@tagStatsTop; 8 | 9 | STRING jsonStr; 10 | bool needComma; 11 | 12 | vCountry = { Country.* }; 13 | vCountry = 14 | SELECT v 15 | FROM vCountry:v 16 | WHERE v.name == countryName; 17 | 18 | vMessage = 19 | SELECT t 20 | FROM vCountry:s-((Comment_IS_LOCATED_IN_Country_REVERSE|Post_IS_LOCATED_IN_Country_REVERSE):e)->(Comment|Post):t; 21 | 22 | vMessage = 23 | SELECT s 24 | FROM vMessage:s-((Comment_HAS_TAG_Tag|Post_HAS_TAG_Tag):e)->Tag:t 25 | ACCUM @@monthlyGroup += (year(s.creationDate), month(s.creationDate) -> (t.name -> 1)); 26 | 27 | FOREACH (y,m,tg) IN @@monthlyGroup DO 28 | @@tagInfoTop.clear(); 29 | // put tags into heap to get 5 most popular tags 30 | FOREACH t IN tg DO 31 | @@tagInfoTop += tagInfo(t.tagName, t.popularity); 32 | END; 33 | 34 | // put 5 most popular tags into JSONARRAY 35 | jsonStr = "["; 36 | needComma = False; 37 | FOREACH ti IN @@tagInfoTop DO 38 | IF needComma THEN 39 | jsonStr = jsonStr + ","; 40 | ELSE 41 | needComma = True; 42 | END; 43 | jsonStr = jsonStr + "[\"" + ti.tag_name + "\"," + to_string(ti.popularity) + "]"; 44 | END; 45 | jsonStr = jsonStr + "]"; 46 | @@tagStatsTop += tagStats(y, m, parse_json_array(jsonStr)); 47 | END; 48 | 49 | PRINT @@tagStatsTop; 50 | } 51 | -------------------------------------------------------------------------------- /tiger/queries/interactive_complex/ic_13.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ic_13(VERTEX person1Id, VERTEX person2Id) FOR GRAPH ldbc_snb { 2 | SumAccum @dist1 = -1, @dist2 = -1; 3 | SumAccum @@next; 4 | OrAccum @@found = False; 5 | MinAccum @@dist12; 6 | 7 | IF person1Id != person2Id THEN 8 | vPerson = { person1Id, person2Id }; 9 | vPerson = 10 | SELECT v 11 | FROM vPerson:v 12 | ACCUM 13 | CASE 14 | WHEN v == person1Id THEN 15 | v.@dist1 = 0 16 | WHEN v == person2Id THEN 17 | v.@dist2 = 0 18 | END; 19 | 20 | WHILE NOT @@found DO 21 | @@next = 0; 22 | 23 | vPerson = 24 | SELECT t 25 | FROM vPerson:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t 26 | WHERE (s.@dist1 > -1 AND t.@dist1 < 0) OR (s.@dist2 > -1 AND t.@dist2 < 0) 27 | ACCUM 28 | CASE 29 | WHEN (s.@dist1 > -1 AND t.@dist2 > -1) OR (s.@dist2 > -1 AND t.@dist1 > -1) THEN 30 | @@found += True, 31 | IF s.@dist1 > -1 THEN 32 | @@dist12 += s.@dist1 + t.@dist2 + 1 33 | END 34 | WHEN s.@dist1 > -1 THEN 35 | @@next += 1, 36 | t.@dist1 = s.@dist1 + 1 37 | WHEN s.@dist2 > -1 THEN 38 | @@next += 1, 39 | t.@dist2 = s.@dist2 + 1 40 | END 41 | POST-ACCUM 42 | IF NOT @@found AND t.@dist1 > -1 AND t.@dist2 > -1 THEN 43 | @@found += True, 44 | @@dist12 += t.@dist1 + t.@dist2 45 | END; 46 | 47 | IF @@next == 0 THEN 48 | @@dist12 = -1; 49 | BREAK; 50 | END; 51 | 52 | END; 53 | ELSE 54 | @@dist12 += 0; 55 | END; 56 | 57 | PRINT @@dist12 AS shortestPathLength; 58 | } -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_18.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_18(DATETIME minDate, INT lengthThreshold, SET languages) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE INFO; 3 | 4 | HeapAccum(1, personCount DESC, messageCount DESC) @@result; 5 | MapAccum @@count; 6 | SetAccum @messages; 7 | SumAccum @messageCount; 8 | OrAccum @inLanguages; 9 | INT tot = 0; 10 | INT num_0 = 0; 11 | 12 | vPerson = { Person.* }; 13 | tot = vPerson.size(); 14 | 15 | vPost = 16 | SELECT t 17 | FROM vPerson:s-(Post_HAS_CREATOR_Person_REVERSE:e)->Post:t 18 | WHERE t.content != "" 19 | AND t.length < lengthThreshold 20 | AND t.creationDate > minDate 21 | AND t.lang IN languages 22 | ACCUM t.@inLanguages = TRUE; 23 | 24 | vStart(ANY) = { Post.* }; 25 | vStart = 26 | SELECT s 27 | FROM vStart:s 28 | WHERE s.lang IN languages; 29 | 30 | WHILE vStart.size() > 0 DO 31 | vStart = 32 | SELECT t 33 | FROM vStart:s-((Comment_REPLY_OF_Post_REVERSE|Comment_REPLY_OF_Comment_REVERSE):e)->:t 34 | ACCUM t.@inLanguages = TRUE; 35 | END; 36 | 37 | vPerson = 38 | SELECT s 39 | FROM vPerson:s-((Comment_HAS_CREATOR_Person_REVERSE|Post_HAS_CREATOR_Person_REVERSE):e)->:t 40 | WHERE t.content != "" 41 | AND t.length < lengthThreshold 42 | AND t.creationDate > minDate 43 | AND t.@inLanguages 44 | ACCUM s.@messages += t.id 45 | POST-ACCUM s.@messageCount = s.@messages.size(), 46 | @@count += (s.@messageCount -> 1); 47 | 48 | num_0 = tot - vPerson.size(); 49 | IF num_0 != 0 THEN 50 | @@count += (0 -> num_0); 51 | END; 52 | 53 | @@result.resize(@@count.size()); 54 | FOREACH (messageCount, personCount) IN @@count DO 55 | @@result += INFO(messageCount, personCount); 56 | END; 57 | 58 | PRINT @@result; 59 | } 60 | -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_5.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_5(STRING countryName) FOR GRAPH ldbc_snb { 2 | OrAccum @isCitizen; 3 | SetAccum @popCount; 4 | //SetAccum @@topForum; 5 | SetAccum @postCount; 6 | //SetAccum @@topPost; 7 | OrAccum @valid = false; 8 | 9 | vStart(ANY) = { Country.* }; 10 | 11 | vStart = SELECT s 12 | FROM vStart:s 13 | WHERE s.name == countryName; 14 | 15 | vCity = 16 | SELECT t 17 | FROM vStart:s-(City_IS_PART_OF_Country_REVERSE:e)->City:t; 18 | 19 | vPerson = 20 | SELECT t 21 | FROM vCity:s-(Person_IS_LOCATED_IN_City_REVERSE:e)->Person:t 22 | ACCUM t.@isCitizen = TRUE; 23 | 24 | vForum = 25 | SELECT t 26 | FROM vPerson:s-(Forum_HAS_MEMBER_Person_REVERSE:e)->Forum:t; 27 | 28 | tmp = 29 | SELECT t 30 | FROM vForum:s-(Forum_HAS_MEMBER_Person:e)->Person:t 31 | WHERE t.@isCitizen 32 | ACCUM s.@popCount += t.id; 33 | 34 | topForum = 35 | SELECT s 36 | FROM vForum:s 37 | ORDER BY s.@popCount.size() DESC, s.id ASC 38 | LIMIT 100; 39 | 40 | tmp2 = 41 | SELECT s 42 | FROM topForum:s 43 | ; 44 | //ACCUM @@topForum += s.id; 45 | 46 | vPerson2 = 47 | SELECT t 48 | FROM topForum:s-(Forum_HAS_MEMBER_Person:e)->Person:t; 49 | 50 | topPost = 51 | SELECT t 52 | FROM topForum:s-(Forum_CONTAINER_OF_Post:e)->Post:t 53 | ACCUM t.@valid = true; 54 | //ACCUM @@topPost += t.id; 55 | 56 | vPost = 57 | SELECT t 58 | FROM vPerson2:s-(Post_HAS_CREATOR_Person_REVERSE:e)->Post:t 59 | WHERE t.@valid == true 60 | //WHERE t.id IN @@topPost 61 | ACCUM s.@postCount += t.id; 62 | 63 | res = 64 | SELECT s 65 | FROM vPerson2:s 66 | ORDER BY s.@postCount.SIZE() DESC, s.id ASC 67 | LIMIT 100; 68 | 69 | PRINT res[res.@postCount.size() AS postCount, res.firstName AS firstName, res.lastName AS lastName, res.creationDate AS creationDate, res.id AS id]; 70 | } 71 | -------------------------------------------------------------------------------- /tiger/queries/interactive_short/is_7.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY is_7(STRING messageId) FOR GRAPH ldbc_snb { 2 | SetAccum @@seed; 3 | //SetAccum @@friendIds; 4 | OrAccum @valid = false; 5 | SumAccum @replierId; 6 | SumAccum @replierFirstName, @replierLastName; 7 | OrAccum @knows; 8 | 9 | @@seed += messageId; 10 | vComments = to_vertex_set(@@seed, "Comment"); 11 | 12 | IF vComments.size() > 0 THEN 13 | vCreator = 14 | SELECT t 15 | FROM vComments:s-(Comment_HAS_CREATOR_Person:e)->Person:t; 16 | 17 | vReply = 18 | SELECT t 19 | FROM vComments:s-(Comment_REPLY_OF_Comment_REVERSE:e)->Comment:t; 20 | ELSE 21 | vPost = to_vertex_set(@@seed, "Post"); 22 | vCreator = 23 | SELECT t 24 | FROM vPost:s-(Post_HAS_CREATOR_Person:e)->Person:t; 25 | 26 | vReply = 27 | SELECT t 28 | FROM vPost:s-(Comment_REPLY_OF_Post_REVERSE:e)->Comment:t; 29 | END; 30 | 31 | vFriend = 32 | SELECT t 33 | FROM vCreator:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t 34 | //POST-ACCUM @@friendIds += t.id; 35 | POST-ACCUM t.@valid = true; 36 | 37 | vReply = 38 | SELECT s 39 | FROM vReply:s-(Comment_HAS_CREATOR_Person:e)->Person:t 40 | ACCUM 41 | s.@replierId = t.id, 42 | s.@replierFirstName = t.firstName, 43 | s.@replierLastName = t.lastName, 44 | //CASE WHEN @@friendIds.contains(t.id) THEN s.@knows += True END 45 | CASE WHEN t.@valid THEN s.@knows += True END 46 | ORDER BY s.creationDate DESC, s.@replierId ASC; 47 | 48 | PRINT vReply[ 49 | vReply.id AS commentId, 50 | vReply.content AS commentContent, 51 | vReply.creationDate AS commentCreationDate, 52 | vReply.@replierId AS replyAuthorId, 53 | vReply.@replierFirstName AS replyAuthorFirstName, 54 | vReply.@replierLastName AS replyAuthorLastName, 55 | vReply.@knows AS replyAuthorKnowsOriginalMessageAuthor]; 56 | } 57 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Graph_DB_Benchmark 2 | 3 | This project evaluates 4 graph databases - [Neo4j](https://neo4j.com/), [AgensGraph](https://bitnine.net/), [LightGraph](https://fma-ai.cn/) and [TigerGraph](https://www.tigergraph.com/), based on the LDBC_SNB benchmark. Scripts and experimental results are included so you can reproduce the benchmark results following our guide. 4 | 5 | ## Data Generation 6 | 7 | You can use [ldbc_snb_datagen](https://github.com/ldbc/ldbc_snb_datagen) to generate LDBC raw data. The [`params.ini`](params.ini) is our configuration file, in which you can change the value of **scaleFactor** to generate datasets with different scales. In this evaluation, we generate 3 datasets with scale factor 1, 10 and 100. 8 | 9 | ## Evaluation 10 | 11 | ### Scripts 12 | 13 | The installation and evaluation method of each database is listed in the corresponding folder. Most scripts and query statements are obtained from their websites or staff. 14 | 15 | ### Parameters 16 | 17 | Seeds folder contains our experimental parameters. `Seeds_1`, `seeds_10`, `seeds_100` contains parameters used in micro queries(interactive update and short query) for different scale datasets. Seeds_macro contains parameters used in macro queries(interactive complex and business intelligence query), which are same for different datasets. 18 | 19 | ## Results 20 | 21 | We conducted all experiments on a single machine with *two 20-core processors Intel Xeon E5-2680 v2 2.80GHz*, *96GB main memory*, and *960G NVMe SSD*, runnig *Ubuntu 16.04.5* operating system. You can find our results in [`result-all.csv`](result-all.csv). 22 | 23 | ## Publication 24 | 25 | Ran Wang, Zhengyi Yang, Wenjie Zhang, and Xuemin Lin. "[An Empirical Study on Recent Graph Database Systems](https://link.springer.com/chapter/10.1007/978-3-030-55130-8_29)". The 13th International Conference on Knowledge Science, Engineering and Management (KSEM 2020). 26 | 27 | ## Issues 28 | 29 | Please send to wangransei@gmail.com for any further questions. 30 | -------------------------------------------------------------------------------- /seeds/seeds_10/interactive_0_0_is3.csv: -------------------------------------------------------------------------------- 1 | 6597069833514 2 | 32985348879015 3 | 7521 4 | 24189255865212 5 | 21990232593909 6 | 24189255829782 7 | 2199023300926 8 | 6597069784706 9 | 17592186087798 10 | 30786325594958 11 | 17592186048261 12 | 28587302385396 13 | 32985348860469 14 | 26388279138163 15 | 32985348863247 16 | 10995116288378 17 | 24189255833683 18 | 19791209318158 19 | 2199023283149 20 | 21990232585318 21 | 2199023267325 22 | 8796093054285 23 | 15393162800281 24 | 21990232585456 25 | 30786325639524 26 | 6597069791734 27 | 19791209304470 28 | 4281 29 | 30786325626892 30 | 24189255870328 31 | 32985348839854 32 | 8796093040855 33 | 44824 34 | 26388279113106 35 | 10995116298450 36 | 21990232616867 37 | 15393162846099 38 | 10995116308111 39 | 6597069835600 40 | 8796093025074 41 | 2199023315740 42 | 6597069813838 43 | 32985348871312 44 | 32985348868261 45 | 8796093026337 46 | 30786325609303 47 | 6597069817820 48 | 28587302325083 49 | 30048 50 | 61171 51 | 38953 52 | 17592186086748 53 | 30786325614211 54 | 19791209326507 55 | 32985348855497 56 | 13194139594779 57 | 26388279080027 58 | 4398046546219 59 | 8796093034899 60 | 13194139535632 61 | 28587302389622 62 | 32985348889015 63 | 28587302383951 64 | 4398046520326 65 | 32985348859805 66 | 30786325585514 67 | 21990232602109 68 | 32985348888103 69 | 26388279084009 70 | 2199023306375 71 | 24189255844262 72 | 13194139583773 73 | 19791209313520 74 | 15393162826172 75 | 17592186079519 76 | 8796093036481 77 | 30786325643752 78 | 2199023259874 79 | 16327 80 | 15393162838326 81 | 28587302328584 82 | 6597069821854 83 | 26388279072314 84 | 6597069829584 85 | 30786325579648 86 | 28587302382762 87 | 28587302338710 88 | 28587302353776 89 | 30786325617353 90 | 15393162813639 91 | 30786325590349 92 | 28587302379094 93 | 32985348850585 94 | 15393162839554 95 | 24189255819138 96 | 25340 97 | 10995116333051 98 | 19791209302613 99 | 10995116348613 100 | 15393162798806 101 | 33319 102 | -------------------------------------------------------------------------------- /seeds/seeds_1/interactive_0_0_is4.csv: -------------------------------------------------------------------------------- 1 | 2199027469233 2 | 2199027723023 3 | 2199027469244 4 | 2199027695693 5 | 2199023614813 6 | 2199029724711 7 | 2199026345559 8 | 2199023398807 9 | 2199025515384 10 | 2199027469247 11 | 2199027946440 12 | 2199028220531 13 | 2199025368408 14 | 2199028165147 15 | 2199025515386 16 | 2199029688186 17 | 2199023705384 18 | 2199024573549 19 | 2199029724713 20 | 2199025515380 21 | 2199025358218 22 | 2199027790376 23 | 2199023655357 24 | 2199023655353 25 | 2199024213905 26 | 2199023411118 27 | 2199025736213 28 | 2199023574029 29 | 2199029724706 30 | 2199026008076 31 | 2199026390855 32 | 2199025762914 33 | 2199023727527 34 | 2199027469234 35 | 2199027946439 36 | 2199023655360 37 | 2199025358254 38 | 2199024287982 39 | 2199024636413 40 | 2199027551589 41 | 2199023574022 42 | 2199023655348 43 | 2199028070183 44 | 2199025986581 45 | 2199024609217 46 | 2199023698525 47 | 2199025368405 48 | 2199029730746 49 | 2199024461266 50 | 2199026276851 51 | 2199027469239 52 | 2199023265279 53 | 2199023693676 54 | 2199029724705 55 | 2199028094676 56 | 2199023727524 57 | 2199025373974 58 | 2199023630418 59 | 2199023727522 60 | 2199029724708 61 | 2199024483106 62 | 2199027469241 63 | 2199024073403 64 | 2199024275456 65 | 2199029730745 66 | 2199027469238 67 | 2199024213901 68 | 2199027608845 69 | 2199027684074 70 | 2199027946437 71 | 2199025519065 72 | 2199026390850 73 | 2199028070185 74 | 2199025974038 75 | 2199029564171 76 | 2199025515381 77 | 2199025425503 78 | 2199024573545 79 | 2199023564316 80 | 2199029724709 81 | 2199024275453 82 | 2199024483107 83 | 2199025461537 84 | 2199023693661 85 | 2199027551588 86 | 2199027469232 87 | 2199025515370 88 | 2199023655356 89 | 2199027733711 90 | 2199027946438 91 | 2199023588205 92 | 2199028353701 93 | 2199025373970 94 | 2199023655355 95 | 2199029755196 96 | 2199024038763 97 | 2199027573256 98 | 2199025515375 99 | 2199027469243 100 | 2199023655351 101 | 2199025358207 102 | -------------------------------------------------------------------------------- /seeds/seeds_1/interactive_0_0_is5.csv: -------------------------------------------------------------------------------- 1 | 2199027946439 2 | 2199027469246 3 | 2199026390850 4 | 2199026390853 5 | 2199023285529 6 | 2199028353701 7 | 2199024145680 8 | 2199025368413 9 | 2199028388876 10 | 2199023655352 11 | 2199029823290 12 | 2199023655355 13 | 2199023574029 14 | 2199023838148 15 | 2199028350928 16 | 2199025461537 17 | 2199027551588 18 | 2199029724706 19 | 2199025373974 20 | 2199023727524 21 | 2199025412966 22 | 2199024580040 23 | 2199027723019 24 | 2199024636413 25 | 2199024483104 26 | 2199023655356 27 | 2199023655347 28 | 2199027608845 29 | 2199026276860 30 | 2199027723021 31 | 2199027790376 32 | 2199028165147 33 | 2199025368407 34 | 2199027723020 35 | 2199024213901 36 | 2199023655348 37 | 2199026251583 38 | 2199025358922 39 | 2199029688186 40 | 2199027469241 41 | 2199025515374 42 | 2199027469234 43 | 2199029724716 44 | 2199023727527 45 | 2199025358489 46 | 2199027971517 47 | 2199027461723 48 | 2199027469239 49 | 2199025515385 50 | 2199027469240 51 | 2199025736213 52 | 2199027688965 53 | 2199025519070 54 | 2199025358207 55 | 2199025368405 56 | 2199024573545 57 | 2199028220531 58 | 2199029564170 59 | 2199025515378 60 | 2199027573256 61 | 2199029724709 62 | 2199027469245 63 | 2199023574022 64 | 2199025463909 65 | 2199028337171 66 | 2199027469235 67 | 2199029755196 68 | 2199025515370 69 | 2199026153003 70 | 2199025986581 71 | 2199029724707 72 | 2199025630699 73 | 2199023705378 74 | 2199025515375 75 | 2199026345559 76 | 2199027733711 77 | 2199025515381 78 | 2199023398807 79 | 2199025358218 80 | 2199024437513 81 | 2199023655350 82 | 2199023265287 83 | 2199027946436 84 | 2199023614813 85 | 2199027469248 86 | 2199028382957 87 | 2199025368410 88 | 2199025515372 89 | 2199025519065 90 | 2199027723018 91 | 2199027469244 92 | 2199026390855 93 | 2199026276851 94 | 2199027469236 95 | 2199029564171 96 | 2199029724711 97 | 2199027469238 98 | 2199024038763 99 | 2199024483103 100 | 2199024275448 101 | 2199025368408 102 | -------------------------------------------------------------------------------- /seeds/seeds_1/interactive_0_0_is6.csv: -------------------------------------------------------------------------------- 1 | 2199023276308 2 | 2199024580040 3 | 2199023727524 4 | 2199025736202 5 | 2199024287978 6 | 2199024038761 7 | 2199028337169 8 | 2199023838144 9 | 2199023285526 10 | 2199023453332 11 | 2199025974036 12 | 2199023574021 13 | 2199024573537 14 | 2199023727524 15 | 2199024573537 16 | 2199023411105 17 | 2199023554207 18 | 2199025358215 19 | 2199025358920 20 | 2199025519057 21 | 2199023630405 22 | 2199028094678 23 | 2199024483103 24 | 2199025519068 25 | 2199027551588 26 | 2199024145670 27 | 2199027526856 28 | 2199028382954 29 | 2199027461721 30 | 2199027971511 31 | 2199024275447 32 | 2199023727521 33 | 2199029779413 34 | 2199023693659 35 | 2199026008072 36 | 2199023411117 37 | 2199026345557 38 | 2199024483103 39 | 2199029730744 40 | 2199028353699 41 | 2199025358756 42 | 2199026152997 43 | 2199025468033 44 | 2199023727521 45 | 2199029688181 46 | 2199023614810 47 | 2199024609213 48 | 2199024580036 49 | 2199026107227 50 | 2199025463898 51 | 2199029730739 52 | 2199027684072 53 | 2199028388872 54 | 2199026276850 55 | 2199028244144 56 | 2199024213897 57 | 2199028094671 58 | 2199027695685 59 | 2199024483103 60 | 2199029564165 61 | 2199025373968 62 | 2199025373965 63 | 2199025974033 64 | 2199025358253 65 | 2199023693674 66 | 2199028165141 67 | 2199023265282 68 | 2199025461536 69 | 2199025630687 70 | 2199023574022 71 | 2199023705378 72 | 2199029564163 73 | 2199027971509 74 | 2199028351415 75 | 2199025425500 76 | 2199024073391 77 | 2199025358203 78 | 2199025358488 79 | 2199026251581 80 | 2199023453331 81 | 2199026276851 82 | 2199024275448 83 | 2199025762913 84 | 2199024437510 85 | 2199023588203 86 | 2199024636411 87 | 2199023564311 88 | 2199024160338 89 | 2199024213901 90 | 2199027733710 91 | 2199023614795 92 | 2199025375126 93 | 2199028220525 94 | 2199023265277 95 | 2199028070180 96 | 2199025412965 97 | 2199023398806 98 | 2199023698525 99 | 2199028350925 100 | 2199028070183 101 | 2199024275448 102 | -------------------------------------------------------------------------------- /seeds/seeds_1/interactive_0_0_is7.csv: -------------------------------------------------------------------------------- 1 | 2199027551588 2 | 2199025358920 3 | 2199024483103 4 | 2199025373965 5 | 2199023630405 6 | 2199026152997 7 | 2199026251581 8 | 2199028353699 9 | 2199023453331 10 | 2199023276308 11 | 2199026008072 12 | 2199023727521 13 | 2199024483103 14 | 2199027971509 15 | 2199024275448 16 | 2199023398806 17 | 2199025974036 18 | 2199029730744 19 | 2199028220525 20 | 2199024437510 21 | 2199025412965 22 | 2199024160338 23 | 2199023265282 24 | 2199025358215 25 | 2199024609213 26 | 2199025373968 27 | 2199023727521 28 | 2199029730739 29 | 2199028350925 30 | 2199024213897 31 | 2199023411117 32 | 2199027526856 33 | 2199024275448 34 | 2199023614795 35 | 2199025358756 36 | 2199029564165 37 | 2199026276850 38 | 2199026107227 39 | 2199023411105 40 | 2199027461721 41 | 2199023574022 42 | 2199028351415 43 | 2199026345557 44 | 2199027684072 45 | 2199023693674 46 | 2199023705378 47 | 2199028388872 48 | 2199023285526 49 | 2199025463898 50 | 2199025358488 51 | 2199024636411 52 | 2199024287978 53 | 2199028094671 54 | 2199023698525 55 | 2199023554207 56 | 2199024145670 57 | 2199023574021 58 | 2199023614810 59 | 2199025519068 60 | 2199029688181 61 | 2199029564163 62 | 2199023838144 63 | 2199023693659 64 | 2199024573537 65 | 2199024580036 66 | 2199024213901 67 | 2199023727524 68 | 2199025519057 69 | 2199025762913 70 | 2199025736202 71 | 2199027971511 72 | 2199028094678 73 | 2199024483103 74 | 2199025974033 75 | 2199028382954 76 | 2199028244144 77 | 2199025358203 78 | 2199025375126 79 | 2199027733710 80 | 2199025630687 81 | 2199024073391 82 | 2199025425500 83 | 2199028070183 84 | 2199025468033 85 | 2199024580040 86 | 2199024275447 87 | 2199023564311 88 | 2199023588203 89 | 2199025358253 90 | 2199026276851 91 | 2199025461536 92 | 2199024038761 93 | 2199029779413 94 | 2199027695685 95 | 2199028070180 96 | 2199028337169 97 | 2199023727524 98 | 2199023265277 99 | 2199024573537 100 | 2199023453332 101 | 2199028165141 102 | -------------------------------------------------------------------------------- /seeds/seeds_10/interactive_0_0_is4.csv: -------------------------------------------------------------------------------- 1 | 8796121923098 2 | 8796132071901 3 | 8796094725855 4 | 8796107923180 5 | 8796101778731 6 | 8796104070860 7 | 8796098325828 8 | 8796115195847 9 | 8796123643150 10 | 8796122938203 11 | 8796105484733 12 | 8796107169918 13 | 8796132071905 14 | 8796103406251 15 | 8796096109322 16 | 8796119284073 17 | 8796119440684 18 | 8796097621389 19 | 8796107662913 20 | 8796124325764 21 | 8796127192975 22 | 8796099836185 23 | 8796124325761 24 | 8796110903567 25 | 8796111968217 26 | 8796133392576 27 | 8796096109318 28 | 8796117014413 29 | 8796113815448 30 | 8796103428953 31 | 8796112290458 32 | 8796098285352 33 | 8796110941128 34 | 8796124325762 35 | 8796119059336 36 | 8796096109317 37 | 8796094254216 38 | 8796114843559 39 | 8796122349735 40 | 8796110309670 41 | 8796122686269 42 | 8796099875896 43 | 8796095707761 44 | 8796112859181 45 | 8796112280803 46 | 8796124354067 47 | 8796099879444 48 | 8796096014216 49 | 8796107552384 50 | 8796107169920 51 | 8796119440689 52 | 8796132956095 53 | 8796113228478 54 | 8796124325768 55 | 8796095551746 56 | 8796098325824 57 | 8796131128249 58 | 8796096109320 59 | 8796107169921 60 | 8796095551742 61 | 8796129876295 62 | 8796132071899 63 | 8796103406249 64 | 8796097611279 65 | 8796111968216 66 | 8796119440682 67 | 8796132071903 68 | 8796110827099 69 | 8796095888857 70 | 8796122842476 71 | 8796111552382 72 | 8796098196965 73 | 8796112280805 74 | 8796119186383 75 | 8796118581458 76 | 8796112786934 77 | 8796099874380 78 | 8796123889352 79 | 8796096007350 80 | 8796112471444 81 | 8796103410884 82 | 8796096138130 83 | 8796119440683 84 | 8796098325826 85 | 8796095551749 86 | 8796101358895 87 | 8796102097408 88 | 8796094254232 89 | 8796119440686 90 | 8796114328475 91 | 8796099294294 92 | 8796105928113 93 | 8796098325832 94 | 8796112280802 95 | 8796096718684 96 | 8796103406250 97 | 8796096802611 98 | 8796103661786 99 | 8796132071904 100 | 8796094059901 101 | 8796124325767 102 | -------------------------------------------------------------------------------- /seeds/seeds_10/interactive_0_0_is5.csv: -------------------------------------------------------------------------------- 1 | 8796107738457 2 | 8796107662913 3 | 8796124325770 4 | 8796113228478 5 | 8796122938203 6 | 8796119440685 7 | 8796132071902 8 | 8796116518682 9 | 8796129876295 10 | 8796110827099 11 | 8796111502714 12 | 8796099127561 13 | 8796098325829 14 | 8796103410884 15 | 8796102097408 16 | 8796100381457 17 | 8796096138130 18 | 8796124325766 19 | 8796110903567 20 | 8796096556427 21 | 8796122147617 22 | 8796099874380 23 | 8796097621389 24 | 8796128759287 25 | 8796095551749 26 | 8796112280802 27 | 8796095551746 28 | 8796094254216 29 | 8796095929462 30 | 8796112280805 31 | 8796125377777 32 | 8796095888857 33 | 8796114843559 34 | 8796103406249 35 | 8796104575335 36 | 8796097571028 37 | 8796096007350 38 | 8796093245393 39 | 8796132071904 40 | 8796098829611 41 | 8796102707617 42 | 8796112471444 43 | 8796094107743 44 | 8796101771088 45 | 8796103661786 46 | 8796108822023 47 | 8796111968216 48 | 8796132071899 49 | 8796119440683 50 | 8796094725855 51 | 8796096466784 52 | 8796107552384 53 | 8796124325763 54 | 8796095551744 55 | 8796112242101 56 | 8796119059336 57 | 8796107799909 58 | 8796112280801 59 | 8796123884392 60 | 8796123889352 61 | 8796108113076 62 | 8796110309670 63 | 8796095551745 64 | 8796096109318 65 | 8796105120534 66 | 8796117014413 67 | 8796124325768 68 | 8796115195847 69 | 8796097611279 70 | 8796107169921 71 | 8796095470982 72 | 8796119440689 73 | 8796103406250 74 | 8796122842476 75 | 8796095551747 76 | 8796103661782 77 | 8796099294294 78 | 8796111968218 79 | 8796114328475 80 | 8796119440682 81 | 8796098592945 82 | 8796119440690 83 | 8796098325823 84 | 8796126665743 85 | 8796120690195 86 | 8796112280804 87 | 8796099875896 88 | 8796100990099 89 | 8796111968215 90 | 8796128937210 91 | 8796119440688 92 | 8796112859181 93 | 8796124325767 94 | 8796096109319 95 | 8796124325769 96 | 8796112786934 97 | 8796132071906 98 | 8796099879444 99 | 8796104070860 100 | 8796111552382 101 | 8796103123162 102 | -------------------------------------------------------------------------------- /seeds/seeds_10/interactive_0_0_is6.csv: -------------------------------------------------------------------------------- 1 | 8796129009840 2 | 8796097571020 3 | 8796122842470 4 | 8796122147615 5 | 8796102852290 6 | 8796095929458 7 | 8796127192970 8 | 8796103661775 9 | 8796112242099 10 | 8796094059895 11 | 8796095470968 12 | 8796096802605 13 | 8796120690194 14 | 8796094254216 15 | 8796100990096 16 | 8796095888847 17 | 8796125377773 18 | 8796095707751 19 | 8796115195844 20 | 8796113228470 21 | 8796113815440 22 | 8796133392571 23 | 8796108113075 24 | 8796123884378 25 | 8796096138117 26 | 8796112471429 27 | 8796111502707 28 | 8796124318071 29 | 8796122349731 30 | 8796099874373 31 | 8796112471431 32 | 8796094254213 33 | 8796097621386 34 | 8796132440883 35 | 8796099127556 36 | 8796096466780 37 | 8796121923094 38 | 8796131097404 39 | 8796101358888 40 | 8796114813570 41 | 8796107552382 42 | 8796131128242 43 | 8796105484729 44 | 8796102707609 45 | 8796120690190 46 | 8796133281634 47 | 8796111552378 48 | 8796107923177 49 | 8796098829608 50 | 8796093672296 51 | 8796105120532 52 | 8796110827083 53 | 8796103123160 54 | 8796103661782 55 | 8796102097403 56 | 8796126665742 57 | 8796094725853 58 | 8796098731078 59 | 8796122686267 60 | 8796098592937 61 | 8796095471059 62 | 8796124155414 63 | 8796119284065 64 | 8796103410882 65 | 8796107738450 66 | 8796117014409 67 | 8796101771076 68 | 8796104575331 69 | 8796096718681 70 | 8796108752232 71 | 8796094107742 72 | 8796114843558 73 | 8796100381446 74 | 8796099294293 75 | 8796110941127 76 | 8796133336064 77 | 8796112290455 78 | 8796114328468 79 | 8796099875888 80 | 8796099879435 81 | 8796094254231 82 | 8796098285346 83 | 8796119598615 84 | 8796122938195 85 | 8796124354065 86 | 8796097611274 87 | 8796128734235 88 | 8796123643145 89 | 8796111449753 90 | 8796131373093 91 | 8796115455374 92 | 8796132956083 93 | 8796099836183 94 | 8796097851100 95 | 8796111558548 96 | 8796112786932 97 | 8796108822013 98 | 8796098196964 99 | 8796112859178 100 | 8796130126690 101 | 8796103428942 102 | -------------------------------------------------------------------------------- /seeds/seeds_10/interactive_0_0_is7.csv: -------------------------------------------------------------------------------- 1 | 8796122686267 2 | 8796112786932 3 | 8796112471431 4 | 8796111502707 5 | 8796114813570 6 | 8796095929458 7 | 8796096802605 8 | 8796132956083 9 | 8796107738450 10 | 8796113228470 11 | 8796098731078 12 | 8796124155414 13 | 8796094254231 14 | 8796131128242 15 | 8796115455374 16 | 8796100990096 17 | 8796102097403 18 | 8796119284065 19 | 8796130126690 20 | 8796123884378 21 | 8796122842470 22 | 8796103661782 23 | 8796108752232 24 | 8796121923094 25 | 8796098829608 26 | 8796124354065 27 | 8796114328468 28 | 8796097621386 29 | 8796097571020 30 | 8796124318071 31 | 8796101358888 32 | 8796128734235 33 | 8796102707609 34 | 8796132440883 35 | 8796099875888 36 | 8796107923177 37 | 8796113815440 38 | 8796117014409 39 | 8796102852290 40 | 8796122147615 41 | 8796103410882 42 | 8796094107742 43 | 8796099294293 44 | 8796107552382 45 | 8796105120532 46 | 8796112290455 47 | 8796131097404 48 | 8796103123160 49 | 8796094725853 50 | 8796097851100 51 | 8796096138117 52 | 8796112242099 53 | 8796129009840 54 | 8796131373093 55 | 8796093672296 56 | 8796133392571 57 | 8796097611274 58 | 8796119598615 59 | 8796104575331 60 | 8796103428942 61 | 8796098285346 62 | 8796099836183 63 | 8796094254216 64 | 8796133281634 65 | 8796096718681 66 | 8796122938195 67 | 8796108822013 68 | 8796094254213 69 | 8796125377773 70 | 8796123643145 71 | 8796095471059 72 | 8796096466780 73 | 8796100381446 74 | 8796094059895 75 | 8796111449753 76 | 8796120690194 77 | 8796111558548 78 | 8796108113075 79 | 8796105484729 80 | 8796101771076 81 | 8796133336064 82 | 8796110941127 83 | 8796095888847 84 | 8796095707751 85 | 8796126665742 86 | 8796099874373 87 | 8796103661775 88 | 8796114843558 89 | 8796120690190 90 | 8796112859178 91 | 8796127192970 92 | 8796099127556 93 | 8796110827083 94 | 8796098592937 95 | 8796122349731 96 | 8796112471429 97 | 8796095470968 98 | 8796099879435 99 | 8796115195844 100 | 8796098196964 101 | 8796111552378 102 | -------------------------------------------------------------------------------- /seeds/seeds_1/interactive_0_0_is3.csv: -------------------------------------------------------------------------------- 1 | 24189255817479 2 | 21990232559951 3 | 32985348838314 4 | 19791209301132 5 | 10995116282825 6 | 30786325578932 7 | 10995116284056 8 | 2199023255798 9 | 6597069770932 10 | 28587302329195 11 | 30786325587981 12 | 2199023257232 13 | 2292 14 | 2199023265453 15 | 21990232565306 16 | 28587302330822 17 | 4398046514225 18 | 28587302326249 19 | 26388279076608 20 | 17592186050893 21 | 21990232563359 22 | 32985348839614 23 | 13194139538575 24 | 15393162794646 25 | 4398046512573 26 | 9321 27 | 19791209310251 28 | 30786325585909 29 | 21990232565240 30 | 6597069772461 31 | 15393162794737 32 | 4398046522018 33 | 32985348836352 34 | 21990232558990 35 | 1564 36 | 30786325579849 37 | 4398046514450 38 | 30786325585916 39 | 13194139534154 40 | 13194139539592 41 | 28587302327232 42 | 26388279067066 43 | 10995116278353 44 | 28587302332605 45 | 28587302328597 46 | 2199023256552 47 | 2199023263911 48 | 8796093030376 49 | 32985348835805 50 | 19791209306147 51 | 13194139543218 52 | 21990232564009 53 | 2199023255953 54 | 32985348834375 55 | 6597069777302 56 | 4398046514546 57 | 24189255821944 58 | 13194139541678 59 | 13194139541111 60 | 10995116281209 61 | 26388279074202 62 | 6597069770702 63 | 15393162797150 64 | 2199023256744 65 | 26388279073896 66 | 21990232555658 67 | 143 68 | 4398046521251 69 | 19791209308353 70 | 2199023260847 71 | 9496 72 | 26388279075075 73 | 24189255817201 74 | 21990232558208 75 | 8796093031844 76 | 26388279069964 77 | 17592186052746 78 | 6597069772875 79 | 17592186048248 80 | 32985348834483 81 | 32985348837876 82 | 24189255821132 83 | 30786325587419 84 | 8796093023346 85 | 30786325583545 86 | 6597069766733 87 | 15393162798620 88 | 2199023256437 89 | 32985348839821 90 | 21990232556220 91 | 26388279073821 92 | 4398046513872 93 | 26388279070247 94 | 32985348839821 95 | 8796093025074 96 | 17592186053137 97 | 6597069772672 98 | 2199023256077 99 | 4398046517846 100 | 13194139539868 101 | 6597069776310 102 | -------------------------------------------------------------------------------- /seeds/seeds_100/interactive_0_0_is3.csv: -------------------------------------------------------------------------------- 1 | 26388279499386 2 | 169055 3 | 19791209747200 4 | 2199023433245 5 | 32985349243060 6 | 32985349040200 7 | 17592186343663 8 | 28587302666295 9 | 32985349105730 10 | 24189256018796 11 | 30786325978662 12 | 19791209607955 13 | 32985348985799 14 | 32985349151575 15 | 28587302463589 16 | 28587302421001 17 | 8796093450851 18 | 19791209691798 19 | 32985349185017 20 | 30786325934391 21 | 28587302592771 22 | 2199023656047 23 | 19791209574910 24 | 8796093467677 25 | 21990232902646 26 | 479651 27 | 13194139533344 28 | 21990232616540 29 | 6597069948061 30 | 10995116489616 31 | 6597069807982 32 | 32985348998622 33 | 17592186322399 34 | 15393162792459 35 | 19791209550094 36 | 15393162938995 37 | 2199023379827 38 | 13194139815063 39 | 6597069788401 40 | 6597069932162 41 | 2199023605474 42 | 17592186074526 43 | 4398046563877 44 | 32985348883077 45 | 10995116713618 46 | 19791209352012 47 | 19791209330845 48 | 24189256241577 49 | 28587302795794 50 | 301274 51 | 30786325793514 52 | 10995116582749 53 | 17592186454642 54 | 28587302705523 55 | 329357 56 | 30786325942259 57 | 19791209492660 58 | 8796093416766 59 | 26388279497344 60 | 4398046528287 61 | 10995116704905 62 | 21990232739986 63 | 30786325694577 64 | 10995116456681 65 | 24189256270454 66 | 8796093440639 67 | 8796093070876 68 | 17592186201730 69 | 2199023527314 70 | 26388279502528 71 | 21990232660235 72 | 21990232631387 73 | 21990232732566 74 | 8796093166880 75 | 19791209712979 76 | 13194139550698 77 | 17592186271504 78 | 30786325753880 79 | 28587302678702 80 | 2199023455784 81 | 8796093243468 82 | 4398046584797 83 | 28587302787279 84 | 24189256197876 85 | 28587302542155 86 | 6597069963950 87 | 4398046876263 88 | 17592186436876 89 | 19791209487654 90 | 352321 91 | 28587302714310 92 | 28587302675801 93 | 32985349313104 94 | 8796093191611 95 | 21990232656181 96 | 30786325836887 97 | 30786325745080 98 | 10995116409831 99 | 28587302626354 100 | 32985349190731 101 | 19791209393709 -------------------------------------------------------------------------------- /seeds/seeds_1/interactive_0_0_is2.csv: -------------------------------------------------------------------------------- 1 | 10995116288188 2 | 13194139538575 3 | 6597069770044 4 | 10995116279452 5 | 6597069776618 6 | 17592186048873 7 | 17592186049298 8 | 26388279073428 9 | 6107 10 | 10995116279452 11 | 28587302325670 12 | 15393162793919 13 | 10995116279452 14 | 2199023256893 15 | 17592186054214 16 | 32985348836005 17 | 10995116279452 18 | 6597069770044 19 | 32985348840140 20 | 10995116279521 21 | 6597069770044 22 | 9399 23 | 19791209308983 24 | 13194139535287 25 | 15393162790403 26 | 2199023256452 27 | 13194139534279 28 | 17592186047079 29 | 13194139542772 30 | 19791209308983 31 | 15393162798777 32 | 15393162794667 33 | 19791209304170 34 | 2199023260408 35 | 13194139538575 36 | 15393162798952 37 | 4398046511941 38 | 6597069770044 39 | 24189255820147 40 | 19791209310673 41 | 4398046518467 42 | 26388279070189 43 | 13194139534229 44 | 21990232562091 45 | 19791209308983 46 | 8796093026683 47 | 30786325579720 48 | 13194139540794 49 | 26388279068206 50 | 4398046521530 51 | 6597069770044 52 | 6597069770044 53 | 21990232560578 54 | 10995116279452 55 | 4398046513186 56 | 26388279068477 57 | 19791209304685 58 | 26388279068721 59 | 19791209304170 60 | 26388279073428 61 | 17592186053773 62 | 19791209308983 63 | 19791209307655 64 | 10995116279452 65 | 6944 66 | 26388279076608 67 | 8796093029267 68 | 21990232563637 69 | 4398046520326 70 | 26388279073428 71 | 8796093023493 72 | 6597069770044 73 | 10995116279452 74 | 30786325588716 75 | 19791209304170 76 | 17592186044731 77 | 26388279073428 78 | 6597069776618 79 | 21990232563637 80 | 19791209308983 81 | 19791209304170 82 | 26388279073428 83 | 19791209308983 84 | 26388279067625 85 | 17592186054288 86 | 13194139538455 87 | 19791209304170 88 | 6597069770044 89 | 26388279070400 90 | 17592186054222 91 | 6597069770044 92 | 26388279073428 93 | 1274 94 | 19791209308140 95 | 26388279073428 96 | 10995116279452 97 | 6597069772371 98 | 32985348840974 99 | 28587302326035 100 | 15393162795673 101 | 2199023260779 102 | -------------------------------------------------------------------------------- /seeds/seeds_100/interactive_0_0_is2.csv: -------------------------------------------------------------------------------- 1 | 8796093065122 2 | 26388279402843 3 | 17592186283632 4 | 15393163262806 5 | 2199023653007 6 | 6597069890829 7 | 2199023324196 8 | 2199023535020 9 | 24189256206234 10 | 24189256025149 11 | 24189256062722 12 | 24189255942716 13 | 32985348835144 14 | 8796093265687 15 | 10995116387758 16 | 8796093065122 17 | 2199023324196 18 | 26388279103601 19 | 32985348872849 20 | 26388279384121 21 | 6597070146579 22 | 26388279402843 23 | 2199023324196 24 | 19791209613022 25 | 13194139993107 26 | 8796093065122 27 | 8796093190386 28 | 26388279264789 29 | 32985349221439 30 | 8796093065122 31 | 21990232654685 32 | 13194139545512 33 | 24189256062722 34 | 6597070184646 35 | 30786325928183 36 | 8796093065122 37 | 24189256221580 38 | 24189255907595 39 | 24189256221580 40 | 24189256206234 41 | 24189256062722 42 | 21990232888340 43 | 35184372553243 44 | 2199023324196 45 | 4398046682976 46 | 15393163033577 47 | 15393162802523 48 | 17592186438166 49 | 4398046524141 50 | 19791209411508 51 | 19791209594603 52 | 24189256206234 53 | 26388279419948 54 | 24189256062722 55 | 24189255942716 56 | 8796093519050 57 | 2199023540132 58 | 24189255942716 59 | 2199023324196 60 | 2199023324196 61 | 2199023631297 62 | 2199023324196 63 | 19791209393407 64 | 19791209461175 65 | 24189256206234 66 | 2199023324196 67 | 19791209310673 68 | 30786326031915 69 | 2199023324196 70 | 21990232912561 71 | 24189256004425 72 | 24189256118130 73 | 2199023324196 74 | 24189256062722 75 | 15393163099340 76 | 10995116524698 77 | 24189256206234 78 | 4398046755884 79 | 2199023324196 80 | 21990232750722 81 | 2199023324196 82 | 24189256062722 83 | 10995116456659 84 | 24189256221580 85 | 8796093312718 86 | 21990233053289 87 | 24189255942716 88 | 2199023324196 89 | 24189255898495 90 | 24189255942716 91 | 4398046749966 92 | 24189256221580 93 | 449679 94 | 85677 95 | 8796093157432 96 | 6597069825878 97 | 2199023291886 98 | 6597069859491 99 | 8796093065122 100 | 8796093065122 101 | 8796093065122 -------------------------------------------------------------------------------- /seeds/seeds_10/interactive_0_0_is2.csv: -------------------------------------------------------------------------------- 1 | 30786325631623 2 | 4398046574343 3 | 32985348903205 4 | 2199023269868 5 | 28587302326530 6 | 15393162850874 7 | 10995116307169 8 | 21990232593539 9 | 10995116325334 10 | 19791209359083 11 | 21990232603704 12 | 32985348906080 13 | 28587302326530 14 | 10995116303770 15 | 26388279108701 16 | 32985348873687 17 | 8796093032680 18 | 30786325637892 19 | 8796093030025 20 | 21990232605836 21 | 10995116336845 22 | 24189255828651 23 | 15393162792543 24 | 6597069782652 25 | 32985348906080 26 | 6597069818311 27 | 6597069779470 28 | 21990232603704 29 | 4398046559457 30 | 10995116307169 31 | 28587302332407 32 | 2199023327241 33 | 43804 34 | 21990232603704 35 | 19791209319426 36 | 4398046568892 37 | 35184372127885 38 | 17592186067372 39 | 28587302326530 40 | 28623 41 | 24189255819211 42 | 28587302358859 43 | 8796093081231 44 | 28587302326530 45 | 15393162809563 46 | 15393162794667 47 | 32985348848485 48 | 8796093074786 49 | 13194139571364 50 | 13194139594324 51 | 10995116341566 52 | 8796093031885 53 | 15393162794832 54 | 17592186113793 55 | 30786325625663 56 | 19791209364789 57 | 21990232603704 58 | 19791209315342 59 | 6597069794371 60 | 30786325593056 61 | 35184372127885 62 | 10995116301816 63 | 17592186047743 64 | 28587302326530 65 | 4398046569758 66 | 28587302358859 67 | 32985348906080 68 | 54431 69 | 2199023293597 70 | 32985348860172 71 | 10995116291080 72 | 8796093091395 73 | 28587302341993 74 | 19791209319426 75 | 4398046544747 76 | 30786325627510 77 | 26388279095721 78 | 32985348906080 79 | 17592186112616 80 | 30786325627487 81 | 28587302358859 82 | 2199023302506 83 | 24189255854983 84 | 35184372127885 85 | 35184372127885 86 | 13194139571076 87 | 26388279104461 88 | 24189255867821 89 | 28587302358859 90 | 15393162810622 91 | 28587302334623 92 | 35184372127885 93 | 13194139597437 94 | 24189255872403 95 | 21990232603704 96 | 15393162854000 97 | 10995116336845 98 | 30786325592233 99 | 6597069813372 100 | 28587302326530 101 | 41403 102 | -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_2.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_2(DATETIME startDate, DATETIME endDate, STRING country1Name, STRING country2Name) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE INFO; 3 | 4 | HeapAccum(100, messageCount DESC, tagName ASC, ageGroup ASC, personGender ASC, messageMonth ASC, countryName ASC) @@result; 5 | SumAccum @country; 6 | SetAccum @tags; 7 | GroupByAccum messageCount> @@count; 8 | 9 | DATETIME simulationEnd = to_datetime("2013-01-01"); 10 | 11 | vStart(ANY) = { Country.* }; 12 | vStart = 13 | SELECT s 14 | FROM vStart:s 15 | WHERE s.name == country1Name OR s.name == country2Name; 16 | vStart = 17 | SELECT t 18 | FROM vStart:s-(City_IS_PART_OF_Country_REVERSE:e)->City:t 19 | ACCUM t.@country = s.name; 20 | 21 | vPerson = 22 | SELECT t 23 | FROM vStart:s-(Person_IS_LOCATED_IN_City_REVERSE:e)->Person:t 24 | ACCUM t.@country = s.@country; 25 | 26 | vMessages = 27 | SELECT t 28 | FROM vPerson:s-((Comment_HAS_CREATOR_Person_REVERSE|Post_HAS_CREATOR_Person_REVERSE):e)->:t 29 | WHERE t.creationDate BETWEEN startDate AND endDate; 30 | 31 | vMessages = 32 | SELECT s 33 | FROM vMessages:s-((Comment_HAS_TAG_Tag|Post_HAS_TAG_Tag):e)->Tag:t 34 | ACCUM s.@tags += t.name; 35 | 36 | vPerson = 37 | SELECT t 38 | FROM vMessages:s-((Comment_HAS_CREATOR_Person|Post_HAS_CREATOR_Person):e)->Person:t 39 | ACCUM 40 | FOREACH tag IN s.@tags DO 41 | @@count += (t.@country, month(s.creationDate), t.gender, (datetime_diff(simulationEnd, t.birthday) / 31536000 / 5), tag -> 1) 42 | END; 43 | 44 | FOREACH c IN @@count DO 45 | IF c.messageCount > 100 THEN 46 | @@result += INFO(c.countryName, c.messageMonth, c.personGender, c.ageGroup, c.tagName, c.messageCount); 47 | END; 48 | END; 49 | 50 | PRINT @@result; 51 | } 52 | -------------------------------------------------------------------------------- /seeds/seeds_100/interactive_0_0_is1.csv: -------------------------------------------------------------------------------- 1 | 35184372538456 2 | 35184372105964 3 | 35184372369762 4 | 35184372165063 5 | 35184372104012 6 | 35184372530056 7 | 35184372332896 8 | 35184372431247 9 | 35184372182600 10 | 35184372309758 11 | 35184372549933 12 | 35184372225931 13 | 35184372180696 14 | 35184372227542 15 | 35184372216125 16 | 35184372424149 17 | 35184372096260 18 | 35184372142003 19 | 35184372326610 20 | 35184372447059 21 | 35184372515239 22 | 35184372458727 23 | 35184372334234 24 | 35184372343699 25 | 35184372413297 26 | 35184372382763 27 | 35184372398243 28 | 35184372147563 29 | 35184372210449 30 | 35184372238941 31 | 35184372316058 32 | 35184372325190 33 | 35184372501651 34 | 35184372248801 35 | 35184372322387 36 | 35184372159471 37 | 35184372218932 38 | 35184372521121 39 | 35184372312071 40 | 35184372142439 41 | 35184372567437 42 | 35184372437040 43 | 35184372482627 44 | 35184372449326 45 | 35184372192251 46 | 35184372194491 47 | 35184372323545 48 | 35184372144774 49 | 35184372373749 50 | 35184372352031 51 | 35184372098266 52 | 35184372116639 53 | 35184372277432 54 | 35184372162916 55 | 35184372396455 56 | 35184372580527 57 | 35184372398395 58 | 35184372134485 59 | 35184372157633 60 | 35184372430497 61 | 35184372388144 62 | 35184372392555 63 | 35184372234158 64 | 35184372171463 65 | 35184372237200 66 | 35184372535417 67 | 35184372160959 68 | 35184372459634 69 | 35184372553693 70 | 35184372281752 71 | 35184372243650 72 | 35184372504393 73 | 35184372352317 74 | 35184372173349 75 | 35184372252182 76 | 35184372482562 77 | 35184372183730 78 | 35184372401008 79 | 35184372521320 80 | 35184372093118 81 | 35184372432157 82 | 35184372567466 83 | 35184372205252 84 | 35184372106773 85 | 35184372508419 86 | 35184372420875 87 | 35184372302822 88 | 35184372501418 89 | 35184372201647 90 | 35184372336777 91 | 35184372544389 92 | 35184372482211 93 | 35184372366988 94 | 35184372354513 95 | 35184372298191 96 | 35184372228533 97 | 35184372161054 98 | 35184372439282 99 | 35184372403255 100 | 35184372252737 101 | 35184372392838 -------------------------------------------------------------------------------- /seeds/seeds_100/interactive_0_0_is4.csv: -------------------------------------------------------------------------------- 1 | 70369085960460 2 | 70368910921913 3 | 70369122783461 4 | 70369085960454 5 | 70368838749027 6 | 70369084414919 7 | 70368960969462 8 | 70369017893469 9 | 70369117775803 10 | 70369089867982 11 | 70368960969454 12 | 70368969929534 13 | 70368838749029 14 | 70369117775812 15 | 70369124028737 16 | 70369055673639 17 | 70368886745724 18 | 70369049518341 19 | 70368960969458 20 | 70369175614017 21 | 70368814040374 22 | 70369085960457 23 | 70368960969469 24 | 70368812279158 25 | 70369085960447 26 | 70369085960450 27 | 70369033248751 28 | 70368844486563 29 | 70368833296010 30 | 70369117775808 31 | 70368892548912 32 | 70369101239156 33 | 70368960969470 34 | 70368974851630 35 | 70369085960455 36 | 70369058772049 37 | 70368908090281 38 | 70369177290942 39 | 70368947980391 40 | 70368908544783 41 | 70368988934747 42 | 70368953517650 43 | 70369101597058 44 | 70369085960451 45 | 70368960969453 46 | 70369085960453 47 | 70368838749024 48 | 70368759346770 49 | 70369124028734 50 | 70369117775806 51 | 70368838749022 52 | 70369117775809 53 | 70369096908219 54 | 70369085960446 55 | 70368796331706 56 | 70368861003703 57 | 70368753188717 58 | 70369117775805 59 | 70368960969459 60 | 70368973852762 61 | 70369195410405 62 | 70368960969465 63 | 70369101239151 64 | 70368918028366 65 | 70368881416953 66 | 70368756438774 67 | 70368837283600 68 | 70368960969461 69 | 70368996353501 70 | 70369055020164 71 | 70368838749019 72 | 70368841345545 73 | 70369124313178 74 | 70368882346287 75 | 70369055696651 76 | 70368960969455 77 | 70368851520811 78 | 70368838749020 79 | 70368749244574 80 | 70369124028736 81 | 70368889851042 82 | 70369117775801 83 | 70369085960449 84 | 70368912262633 85 | 70368838749021 86 | 70368904334705 87 | 70369117775813 88 | 70368919955907 89 | 70368908493487 90 | 70369018406399 91 | 70369098269260 92 | 70368972783748 93 | 70368899964989 94 | 70368847690642 95 | 70369124028741 96 | 70369124028735 97 | 70369098574623 98 | 70369122593652 99 | 70368902931822 100 | 70369026173174 101 | 70368893288595 -------------------------------------------------------------------------------- /seeds/seeds_100/interactive_0_0_is5.csv: -------------------------------------------------------------------------------- 1 | 70369110318296 2 | 70368908090281 3 | 70368889824674 4 | 70368960969453 5 | 70368796331706 6 | 70369092043414 7 | 70368960969465 8 | 70368972783748 9 | 70368973852762 10 | 70369117775803 11 | 70368960969470 12 | 70369033248751 13 | 70369022988012 14 | 70369017893469 15 | 70368881416953 16 | 70369085960458 17 | 70368881416957 18 | 70368838749029 19 | 70369101239156 20 | 70369117775808 21 | 70368916258085 22 | 70369016979932 23 | 70368892548912 24 | 70368753188717 25 | 70368886745724 26 | 70369085960452 27 | 70368856159486 28 | 70368889851042 29 | 70369117775806 30 | 70369112768112 31 | 70368995685766 32 | 70368781516839 33 | 70369085960454 34 | 70369092490838 35 | 70369195410405 36 | 70368918028366 37 | 70369055020164 38 | 70369085960456 39 | 70368953517650 40 | 70368919955907 41 | 70368848873660 42 | 70368860671595 43 | 70368960969460 44 | 70368906746681 45 | 70368908493487 46 | 70368974851630 47 | 70369117775801 48 | 70369085960459 49 | 70368847690642 50 | 70368904334705 51 | 70368959241896 52 | 70369089867982 53 | 70368960969462 54 | 70368838749022 55 | 70368838749020 56 | 70369124028740 57 | 70368926552156 58 | 70369085960451 59 | 70368824229487 60 | 70368988934747 61 | 70368912442162 62 | 70368841345545 63 | 70368960969466 64 | 70368881416955 65 | 70368787687561 66 | 70369153223925 67 | 70368756438774 68 | 70368881416956 69 | 70368916258083 70 | 70369128289038 71 | 70369051976422 72 | 70368916258086 73 | 70368960969454 74 | 70368863487604 75 | 70368815843502 76 | 70368837283600 77 | 70368787104421 78 | 70368960969457 79 | 70369085960446 80 | 70369117775810 81 | 70369096908219 82 | 70369124028737 83 | 70368960969461 84 | 70368881416952 85 | 70369096497044 86 | 70368852890330 87 | 70368895705150 88 | 70369098324692 89 | 70369051625723 90 | 70369124028736 91 | 70368838749023 92 | 70369058772049 93 | 70368765369856 94 | 70368969929534 95 | 70368958869962 96 | 70369128791855 97 | 70369117775812 98 | 70368860535008 99 | 70368846317661 100 | 70368960969455 101 | 70369122783461 -------------------------------------------------------------------------------- /seeds/seeds_100/interactive_0_0_is6.csv: -------------------------------------------------------------------------------- 1 | 70369051625713 2 | 70368860190538 3 | 70368889824673 4 | 70369060614749 5 | 70368752645588 6 | 70368859843155 7 | 70368912262616 8 | 70369153223924 9 | 70368904334698 10 | 70368815843498 11 | 70368899964983 12 | 70368908493474 13 | 70368767369487 14 | 70369101239147 15 | 70368852890328 16 | 70368861003700 17 | 70369096908217 18 | 70369055696646 19 | 70368882346282 20 | 70369104268178 21 | 70368969929525 22 | 70368789343643 23 | 70368908090277 24 | 70368796331704 25 | 70368918028362 26 | 70368973852759 27 | 70369105517681 28 | 70368969877473 29 | 70369092490837 30 | 70368759346765 31 | 70368860535005 32 | 70369175614006 33 | 70369084414910 34 | 70368988934745 35 | 70368996353497 36 | 70368833296009 37 | 70368919955907 38 | 70369128791851 39 | 70368847690640 40 | 70368907892520 41 | 70368824229484 42 | 70369016979923 43 | 70369124313173 44 | 70369055673635 45 | 70368841345541 46 | 70369017893466 47 | 70368833937345 48 | 70368958869955 49 | 70369051976420 50 | 70369058772048 51 | 70369018406398 52 | 70368787104420 53 | 70369177290938 54 | 70368902931819 55 | 70369096497040 56 | 70369022988009 57 | 70369026173173 58 | 70368893288590 59 | 70368995685753 60 | 70368910921906 61 | 70368959241894 62 | 70369195410404 63 | 70368753188712 64 | 70368895705138 65 | 70369030315686 66 | 70369122593646 67 | 70368814040372 68 | 70368912442160 69 | 70368756438773 70 | 70368903529150 71 | 70368984501693 72 | 70368889851035 73 | 70369098574617 74 | 70368917287026 75 | 70369163700954 76 | 70369089867979 77 | 70369049518334 78 | 70368906746679 79 | 70368894636548 80 | 70368863487599 81 | 70369088721023 82 | 70368950459227 83 | 70368926552153 84 | 70369128289035 85 | 70369110318294 86 | 70368837283599 87 | 70368889663603 88 | 70369146936504 89 | 70369106871932 90 | 70368787687554 91 | 70368972783737 92 | 70368765369851 93 | 70368856159485 94 | 70369101239151 95 | 70368848873653 96 | 70369098269257 97 | 70368749244571 98 | 70369122783459 99 | 70369162756887 100 | 70369158440819 101 | 70369098324682 -------------------------------------------------------------------------------- /seeds/seeds_1/interactive_0_0_is1.csv: -------------------------------------------------------------------------------- 1 | 35184372097985 2 | 35184372096497 3 | 35184372096339 4 | 35184372091107 5 | 35184372093169 6 | 35184372089880 7 | 35184372093651 8 | 35184372096082 9 | 35184372093621 10 | 35184372095168 11 | 35184372098694 12 | 35184372091940 13 | 35184372099091 14 | 35184372096999 15 | 35184372094438 16 | 35184372097728 17 | 35184372093574 18 | 35184372092669 19 | 35184372095173 20 | 35184372092690 21 | 35184372091840 22 | 35184372094031 23 | 35184372092924 24 | 35184372097878 25 | 35184372091588 26 | 35184372098888 27 | 35184372095554 28 | 35184372089834 29 | 35184372097543 30 | 35184372095411 31 | 35184372090497 32 | 35184372094779 33 | 35184372095416 34 | 35184372097711 35 | 35184372094600 36 | 35184372099713 37 | 35184372098266 38 | 35184372095356 39 | 35184372090047 40 | 35184372096614 41 | 35184372095957 42 | 35184372098464 43 | 35184372091430 44 | 35184372094640 45 | 35184372094654 46 | 35184372098244 47 | 35184372092999 48 | 35184372097306 49 | 35184372094825 50 | 35184372096398 51 | 35184372092622 52 | 35184372091794 53 | 35184372089734 54 | 35184372089129 55 | 35184372096260 56 | 35184372098996 57 | 35184372096615 58 | 35184372094682 59 | 35184372097391 60 | 35184372095229 61 | 35184372092485 62 | 35184372092722 63 | 35184372093118 64 | 35184372093727 65 | 35184372092534 66 | 35184372094943 67 | 35184372098935 68 | 35184372096661 69 | 35184372096705 70 | 35184372093899 71 | 35184372093084 72 | 35184372094328 73 | 35184372089763 74 | 35184372089227 75 | 35184372096507 76 | 35184372093971 77 | 35184372090473 78 | 35184372098950 79 | 35184372095846 80 | 35184372090273 81 | 35184372091206 82 | 35184372094169 83 | 35184372096045 84 | 35184372099181 85 | 35184372090141 86 | 35184372091727 87 | 35184372093901 88 | 35184372094304 89 | 35184372090466 90 | 35184372092734 91 | 35184372095791 92 | 35184372095245 93 | 35184372089452 94 | 35184372088889 95 | 35184372089522 96 | 35184372094537 97 | 35184372095133 98 | 35184372096044 99 | 35184372093603 100 | 35184372094275 101 | 35184372093541 102 | -------------------------------------------------------------------------------- /seeds/seeds_10/interactive_0_0_is1.csv: -------------------------------------------------------------------------------- 1 | 35184372155548 2 | 35184372139780 3 | 35184372124922 4 | 35184372159133 5 | 35184372098266 6 | 35184372091840 7 | 35184372160959 8 | 35184372105964 9 | 35184372153757 10 | 35184372096705 11 | 35184372117239 12 | 35184372125182 13 | 35184372146312 14 | 35184372133983 15 | 35184372094304 16 | 35184372104012 17 | 35184372102716 18 | 35184372114840 19 | 35184372116639 20 | 35184372147563 21 | 35184372144774 22 | 35184372127902 23 | 35184372148768 24 | 35184372145602 25 | 35184372099713 26 | 35184372105201 27 | 35184372094682 28 | 35184372118218 29 | 35184372118092 30 | 35184372108920 31 | 35184372119627 32 | 35184372155698 33 | 35184372157633 34 | 35184372134485 35 | 35184372096082 36 | 35184372102837 37 | 35184372095173 38 | 35184372100118 39 | 35184372135758 40 | 35184372137903 41 | 35184372142439 42 | 35184372148267 43 | 35184372144902 44 | 35184372095791 45 | 35184372141481 46 | 35184372094169 47 | 35184372145175 48 | 35184372125198 49 | 35184372156660 50 | 35184372159471 51 | 35184372112531 52 | 35184372113714 53 | 35184372115192 54 | 35184372128947 55 | 35184372093118 56 | 35184372122537 57 | 35184372148497 58 | 35184372090047 59 | 35184372089129 60 | 35184372158169 61 | 35184372120595 62 | 35184372098950 63 | 35184372097391 64 | 35184372101377 65 | 35184372146142 66 | 35184372125157 67 | 35184372126758 68 | 35184372092999 69 | 35184372119292 70 | 35184372142280 71 | 35184372134392 72 | 35184372121587 73 | 35184372140977 74 | 35184372121902 75 | 35184372101333 76 | 35184372105500 77 | 35184372140531 78 | 35184372102593 79 | 35184372101233 80 | 35184372142673 81 | 35184372096260 82 | 35184372095957 83 | 35184372137572 84 | 35184372106773 85 | 35184372146799 86 | 35184372130164 87 | 35184372121928 88 | 35184372139814 89 | 35184372143891 90 | 35184372097711 91 | 35184372094031 92 | 35184372119578 93 | 35184372142101 94 | 35184372106165 95 | 35184372142003 96 | 35184372119275 97 | 35184372103859 98 | 35184372126687 99 | 35184372135555 100 | 35184372161054 101 | 35184372130882 102 | -------------------------------------------------------------------------------- /seeds/seeds_100/interactive_0_0_is7.csv: -------------------------------------------------------------------------------- 1 | 70369098324682 2 | 70369051625713 3 | 70369018406398 4 | 70368882346282 5 | 70369055696646 6 | 70368907892520 7 | 70368919955907 8 | 70368789343643 9 | 70369096497040 10 | 70369088721023 11 | 70368837283599 12 | 70368899964983 13 | 70369175614006 14 | 70369016979923 15 | 70368848873653 16 | 70368996353497 17 | 70368984501693 18 | 70369058772048 19 | 70368926552153 20 | 70369017893466 21 | 70368749244571 22 | 70369089867979 23 | 70368833296009 24 | 70369104268178 25 | 70368918028362 26 | 70369124313173 27 | 70368765369851 28 | 70369049518334 29 | 70368950459227 30 | 70369128791851 31 | 70369153223924 32 | 70368889824673 33 | 70368995685753 34 | 70368859843155 35 | 70368841345541 36 | 70369158440819 37 | 70369026173173 38 | 70368856159485 39 | 70369122783459 40 | 70369098574617 41 | 70368894636548 42 | 70369128289035 43 | 70369146936504 44 | 70368824229484 45 | 70368912442160 46 | 70368917287026 47 | 70369105517681 48 | 70368988934745 49 | 70368861003700 50 | 70368787687554 51 | 70368904334698 52 | 70369110318294 53 | 70368833937345 54 | 70368902931819 55 | 70369122593646 56 | 70368756438773 57 | 70368908090277 58 | 70368903529150 59 | 70368910921906 60 | 70368860535005 61 | 70369051976420 62 | 70368767369487 63 | 70369084414910 64 | 70369096908217 65 | 70368752645588 66 | 70368959241894 67 | 70368895705138 68 | 70369101239147 69 | 70369055673635 70 | 70368796331704 71 | 70368889851035 72 | 70369030315686 73 | 70368852890328 74 | 70369101239151 75 | 70368759346765 76 | 70369163700954 77 | 70369060614749 78 | 70368969877473 79 | 70369092490837 80 | 70368847690640 81 | 70368912262616 82 | 70369022988009 83 | 70368814040372 84 | 70368889663603 85 | 70369195410404 86 | 70368969929525 87 | 70368906746679 88 | 70368815843498 89 | 70369177290938 90 | 70369162756887 91 | 70368908493474 92 | 70368958869955 93 | 70368860190538 94 | 70368893288590 95 | 70368972783737 96 | 70368973852759 97 | 70368787104420 98 | 70369098269257 99 | 70368753188712 100 | 70368863487599 101 | 70369106871932 102 | -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_7.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_7(STRING tagName) FOR GRAPH ldbc_snb { 2 | OrAccum @hasGivenTag; 3 | SumAccum @popularityScore; 4 | SumAccum @authorityScore; 5 | SetAccum @personIdSet; 6 | MapAccum @@personPopScore; 7 | 8 | vTag = {Tag.*}; 9 | vTag = 10 | SELECT s 11 | FROM vTag:s 12 | WHERE s.name == tagName; 13 | 14 | vMessage1 = 15 | SELECT t 16 | FROM vTag:s-((Comment_HAS_TAG_Tag_REVERSE|Post_HAS_TAG_Tag_REVERSE):e)->:t 17 | ACCUM t.@hasGivenTag = TRUE; 18 | 19 | vPerson1 = 20 | SELECT t 21 | FROM vMessage1:s-((Comment_HAS_CREATOR_Person|Post_HAS_CREATOR_Person):e)->Person:t; 22 | 23 | vMessage2 = 24 | SELECT t 25 | FROM vPerson1:s-((Comment_HAS_CREATOR_Person_REVERSE|Post_HAS_CREATOR_Person_REVERSE):e)->(Comment|Post):t WHERE t.@hasGivenTag; 26 | 27 | vPerson2 = 28 | SELECT t 29 | FROM vMessage2:s-((Person_LIKES_Post_REVERSE|Person_LIKES_Comment_REVERSE):e)->Person:t 30 | ACCUM s.@personIdSet += t.id; 31 | 32 | vMessage3 = 33 | SELECT t 34 | FROM vPerson2:s-((Comment_HAS_CREATOR_Person_REVERSE|Post_HAS_CREATOR_Person_REVERSE):e)->(Comment|Post):t; 35 | 36 | vMessage3 = 37 | SELECT s 38 | FROM vMessage3:s-((Person_LIKES_Post_REVERSE|Person_LIKES_Comment_REVERSE):e)->Person:t 39 | ACCUM s.@popularityScore += 1; 40 | 41 | vPerson2 = 42 | SELECT s 43 | FROM vPerson2:s-((Comment_HAS_CREATOR_Person_REVERSE|Post_HAS_CREATOR_Person_REVERSE):e)->(Comment|Post):t 44 | ACCUM @@personPopScore += (s.id -> t.@popularityScore); 45 | 46 | vPerson1 = 47 | SELECT s 48 | FROM vPerson1:s-((Comment_HAS_CREATOR_Person_REVERSE|Post_HAS_CREATOR_Person_REVERSE):e)->(Comment|Post):t 49 | WHERE t.@hasGivenTag 50 | ACCUM s.@personIdSet += t.@personIdSet 51 | POST-ACCUM 52 | FOREACH person IN s.@personIdSet DO 53 | s.@authorityScore += @@personPopScore.get(person) 54 | END 55 | ORDER BY s.@authorityScore DESC, s.id ASC 56 | LIMIT 100; 57 | 58 | PRINT vPerson1[vPerson1.id, vPerson1.@authorityScore]; 59 | } 60 | -------------------------------------------------------------------------------- /neo4j/load_scripts/headers.txt: -------------------------------------------------------------------------------- 1 | comment id:ID(Comment)|creationDate:LONG|locationIP:STRING|browserUsed:STRING|content:STRING|length:INT 2 | forum id:ID(Forum)|title:STRING|creationDate:LONG 3 | organisation id:ID(Organisation)|:LABEL|name:STRING|url:STRING 4 | person id:ID(Person)|firstName:STRING|lastName:STRING|gender:STRING|birthday:LONG|creationDate:LONG|locationIP:STRING|browserUsed:STRING|speaks:STRING[]|email:STRING[] 5 | place id:ID(Place)|name:STRING|url:STRING|:LABEL 6 | post id:ID(Post)|imageFile:STRING|creationDate:LONG|locationIP:STRING|browserUsed:STRING|language:STRING|content:STRING|length:INT 7 | tagclass id:ID(TagClass)|name:STRING|url:STRING 8 | tag id:ID(Tag)|name:STRING|url:STRING 9 | comment_hasCreator_person :START_ID(Comment)|:END_ID(Person) 10 | comment_isLocatedIn_place :START_ID(Comment)|:END_ID(Place) 11 | comment_replyOf_comment :START_ID(Comment)|:END_ID(Comment) 12 | comment_replyOf_post :START_ID(Comment)|:END_ID(Post) 13 | forum_containerOf_post :START_ID(Forum)|:END_ID(Post) 14 | forum_hasMember_person :START_ID(Forum)|:END_ID(Person)|joinDate:LONG 15 | forum_hasModerator_person :START_ID(Forum)|:END_ID(Person) 16 | forum_hasTag_tag :START_ID(Forum)|:END_ID(Tag) 17 | person_hasInterest_tag :START_ID(Person)|:END_ID(Tag) 18 | person_isLocatedIn_place :START_ID(Person)|:END_ID(Place) 19 | person_knows_person :START_ID(Person)|:END_ID(Person)|creationDate:LONG 20 | person_likes_comment :START_ID(Person)|:END_ID(Comment)|creationDate:LONG 21 | person_likes_post :START_ID(Person)|:END_ID(Post)|creationDate:LONG 22 | person_studyAt_organisation :START_ID(Person)|:END_ID(Organisation)|classYear:INT 23 | person_workAt_organisation :START_ID(Person)|:END_ID(Organisation)|workFrom:INT 24 | place_isPartOf_place :START_ID(Place)|:END_ID(Place) 25 | post_hasCreator_person :START_ID(Post)|:END_ID(Person) 26 | comment_hasTag_tag :START_ID(Comment)|:END_ID(Tag) 27 | post_hasTag_tag :START_ID(Post)|:END_ID(Tag) 28 | post_isLocatedIn_place :START_ID(Post)|:END_ID(Place) 29 | tagclass_isSubclassOf_tagclass :START_ID(TagClass)|:END_ID(TagClass) 30 | tag_hasType_tagclass :START_ID(Tag)|:END_ID(TagClass) 31 | organisation_isLocatedIn_place :START_ID(Organisation)|:END_ID(Place) 32 | -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_9.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_9(STRING tagClass1Name, STRING tagClass2Name, INT threshold) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE forumStats; 3 | 4 | OrAccum @isType1, @isType2; 5 | SumAccum @numMembers; 6 | SetAccum> @@forumLarge; 7 | SumAccum @forumId; 8 | GroupByAccum count1, SumAccum count2> @@forumStatsGroup; 9 | HeapAccum(100, count21 DESC, forumId ASC) @@forumStatsTop; 10 | 11 | vTagClass = { TagClass.* }; 12 | vTagClass = 13 | SELECT v 14 | FROM vTagClass:v 15 | WHERE v.name == tagClass1Name OR v.name == tagClass2Name 16 | ACCUM 17 | CASE 18 | WHEN v.name == tagClass1Name THEN 19 | v.@isType1 += True 20 | WHEN v.name == tagClass2Name THEN 21 | v.@isType2 += True 22 | END; 23 | 24 | vTag = 25 | SELECT t 26 | FROM vTagClass:s-(Tag_HAS_TYPE_TagClass_REVERSE:e)->Tag:t 27 | ACCUM 28 | t.@isType1 += s.@isType1, 29 | t.@isType2 += s.@isType2; 30 | 31 | vForum = { Forum.* }; 32 | vForum = 33 | SELECT s 34 | FROM vForum:s-(Forum_HAS_MEMBER_Person:e)->Person:t 35 | ACCUM s.@numMembers += 1 36 | POST-ACCUM CASE WHEN s.@numMembers > threshold THEN @@forumLarge += s END; 37 | 38 | vForum = { @@forumLarge }; 39 | vPost = 40 | SELECT t 41 | FROM vForum:s-(Forum_CONTAINER_OF_Post:e)->Post:t 42 | ACCUM t.@forumId = s.id; 43 | 44 | aggPostTag = 45 | SELECT t 46 | FROM vPost:s-(Post_HAS_TAG_Tag:e)->Tag:t 47 | ACCUM 48 | s.@isType1 += t.@isType1, 49 | s.@isType2 += t.@isType2 50 | POST-ACCUM 51 | If s.@isType1 THEN 52 | @@forumStatsGroup += (s.@forumId -> 1, 0) 53 | END, 54 | IF s.@isType2 THEN 55 | @@forumStatsGroup += (s.@forumId -> 0, 1) 56 | END; 57 | 58 | FOREACH (i,c1,c2) IN @@forumStatsGroup DO 59 | IF c1 > 0 AND c2 > 0 THEN 60 | @@forumStatsTop += forumStats(i, c1, c2, abs(c2 - c1)); 61 | END; 62 | END; 63 | 64 | FOREACH v IN @@forumStatsTop DO 65 | PRINT v.forumId, v.count1, v.count2; 66 | END; 67 | } -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_21.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_21(STRING countryName, DATETIME endDate) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE zombie; 3 | 4 | SumAccum @messageCount; 5 | OrAccum @isZombie; 6 | ListAccum> @likeSet, @zombieLikeSet; 7 | HeapAccum(100, zombieScore DESC, zombieId ASC) @@zombieTop; 8 | 9 | vCountry = { Country.* }; 10 | vCity = 11 | SELECT t 12 | FROM vCountry:s-(City_IS_PART_OF_Country_REVERSE:e)->City:t 13 | WHERE s.name == countryName; 14 | 15 | vPerson = 16 | SELECT t 17 | FROM vCity:s-(Person_IS_LOCATED_IN_City_REVERSE:e)->Person:t 18 | WHERE t.creationDate < endDate; 19 | 20 | vPerson = 21 | SELECT s 22 | FROM vPerson:s-((Comment_HAS_CREATOR_Person_REVERSE|Post_HAS_CREATOR_Person_REVERSE):e)->(Comment|Post):t 23 | WHERE t.creationDate < endDate 24 | ACCUM s.@messageCount += 1; 25 | 26 | vZombie = 27 | SELECT s 28 | FROM vPerson:s 29 | WHERE (s.@messageCount /(1.0*((year(endDate) - year(s.creationDate))*12+(month(endDate)- month(s.creationDate)) + 1))) < 1 30 | ACCUM s.@isZombie = true; 31 | 32 | vMessage = 33 | SELECT t 34 | FROM vZombie:s-((Post_HAS_CREATOR_Person_REVERSE|Comment_HAS_CREATOR_Person_REVERSE):e)->(Post|Comment):t; 35 | 36 | vMessage = 37 | SELECT s 38 | FROM vMessage:s-((Person_LIKES_Post_REVERSE|Person_LIKES_Comment_REVERSE):e)->Person:t 39 | WHERE t.creationDate < endDate 40 | ACCUM 41 | s.@likeSet += t, 42 | CASE WHEN t.@isZombie == true THEN 43 | s.@zombieLikeSet += t 44 | END; 45 | 46 | vZombie = 47 | SELECT s 48 | FROM vZombie:s-((Post_HAS_CREATOR_Person_REVERSE|Comment_HAS_CREATOR_Person_REVERSE):e)->(Post|Comment):t 49 | ACCUM 50 | s.@likeSet += t.@likeSet, 51 | s.@zombieLikeSet += t.@zombieLikeSet 52 | POST-ACCUM 53 | IF s.@likeSet.size() == 0 THEN // avoid division by zero 54 | @@zombieTop += zombie(s.id, s.@zombieLikeSet.size(), s.@likeSet.size(), 0.0) 55 | ELSE 56 | @@zombieTop += zombie(s.id, s.@zombieLikeSet.size(), s.@likeSet.size(), (s.@zombieLikeSet.size() / (s.@likeSet.size() * 1.0))) 57 | END; 58 | 59 | PRINT @@zombieTop; 60 | } 61 | -------------------------------------------------------------------------------- /tiger/queries/interactive_complex/ic_10.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ic_10(VERTEX personId, INT month, INT nextMonth) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE friendInfo; 3 | 4 | OrAccum @visited; 5 | SumAccum @city; 6 | //SetAccum> @@tagInterest; 7 | OrAccum @valid = false; 8 | OrAccum @hasCommonInterest; 9 | SumAccum @commonInterestScore; 10 | HeapAccum(10, commonInterestScore DESC, personId ASC) @@friendInfoTop; 11 | 12 | vPerson = { personId }; 13 | vTag = 14 | SELECT t 15 | FROM vPerson:s-(Person_HAS_INTEREST_Tag:e)->Tag:t 16 | POST-ACCUM t.@valid = true; 17 | //POST-ACCUM @@tagInterest += t; 18 | 19 | vFriend1h = 20 | SELECT t 21 | FROM vPerson:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t 22 | ACCUM 23 | s.@visited += True, 24 | t.@visited += True; 25 | 26 | vFriend2h = 27 | SELECT t 28 | FROM vFriend1h:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t 29 | WHERE t.@visited == False 30 | AND ((month(t.birthday) == month AND day(t.birthday) >= 21) OR 31 | (month(t.birthday) == nextMonth AND day(t.birthday) < 22)); 32 | 33 | vFriend2h = 34 | SELECT s 35 | FROM vFriend2h:s-(Person_IS_LOCATED_IN_City:e)->City:t 36 | ACCUM s.@city = t.name; 37 | 38 | vPost = 39 | SELECT t 40 | FROM vFriend2h:s-(Post_HAS_CREATOR_Person_REVERSE:e)-Post:t; 41 | 42 | findCommonInterest = 43 | SELECT t 44 | FROM vPost:s-(Post_HAS_TAG_Tag:e)->Tag:t 45 | ACCUM CASE WHEN t.@valid THEN s.@hasCommonInterest += True END; 46 | //ACCUM CASE WHEN @@tagInterest.contains(t) THEN s.@hasCommonInterest += True END; 47 | 48 | calcCommonInterestScore = 49 | SELECT t 50 | FROM vPost:s-(Post_HAS_CREATOR_Person:e)->Person:t 51 | ACCUM 52 | CASE 53 | WHEN s.@hasCommonInterest == True THEN 54 | t.@commonInterestScore += 1 55 | ELSE 56 | t.@commonInterestScore += (-1) 57 | END; 58 | 59 | aggFriend2h = 60 | SELECT v 61 | FROM vFriend2h:v 62 | ACCUM @@friendInfoTop += friendInfo(v.id, v.firstName, v.lastName, v.@commonInterestScore, v.gender, v.@city); 63 | 64 | PRINT @@friendInfoTop; 65 | } 66 | -------------------------------------------------------------------------------- /tiger/queries/interactive_complex/ic_12.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ic_12(VERTEX personId, STRING tagClassName) FOR GRAPH ldbc_snb { 2 | TYPEDEF tuple replyStats; 3 | 4 | SumAccum @@numTagsFound, @authorId; 5 | //SetAccum> @@tagAll; 6 | OrAccum @valid = false; 7 | MapAccum> @@postAndTag; 8 | HeapAccum(20, replyCount DESC, personId ASC) @@replyStatsTop; 9 | GroupByAccum replyCount, SetAccum tagNames> @@replyStatsAgg; 10 | 11 | vTagClass(Tag|TagClass) = { TagClass.* }; 12 | vTagClass = 13 | SELECT v 14 | FROM vTagClass:v 15 | WHERE v.name == tagClassName; 16 | 17 | WHILE True DO 18 | vTagClass = 19 | SELECT t 20 | FROM vTagClass:s-((TagClass_IS_SUBCLASS_OF_TagClass_REVERSE|Tag_HAS_TYPE_TagClass_REVERSE):e)->(TagClass|Tag):t 21 | ACCUM 22 | CASE WHEN t.type == "Tag" THEN t.@valid = true END, 23 | //CASE WHEN t.type == "Tag" THEN @@tagAll += t END, 24 | @@numTagsFound += 1; 25 | 26 | IF @@numTagsFound == 0 THEN BREAK; END; 27 | @@numTagsFound = 0; 28 | END; 29 | 30 | vPerson = { personId }; 31 | vFriend = 32 | SELECT t 33 | FROM vPerson:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t; 34 | 35 | vComment = 36 | SELECT t 37 | FROM vFriend:s-(Comment_HAS_CREATOR_Person_REVERSE:e)->Comment:t 38 | ACCUM t.@authorId = s.id; 39 | 40 | vPost = 41 | SELECT t 42 | FROM vComment:s-(Comment_REPLY_OF_Post:e)->Post:t; 43 | 44 | aggPostTag = 45 | SELECT t 46 | FROM vPost:s-(Post_HAS_TAG_Tag)->Tag:t 47 | WHERE t.@valid == true 48 | //WHERE @@tagAll.contains(t) 49 | ACCUM @@postAndTag += (s.id -> t.name); 50 | 51 | aggComment = 52 | SELECT t 53 | FROM vComment:s-(Comment_REPLY_OF_Post:e)->Post:t 54 | WHERE @@postAndTag.containsKey(t.id) 55 | ACCUM @@replyStatsAgg += (s.@authorId -> 1, @@postAndTag.get(t.id)); 56 | 57 | aggFriend = 58 | SELECT v 59 | FROM vFriend:v 60 | WHERE @@replyStatsAgg.containsKey(v.id) 61 | ACCUM @@replyStatsTop += replyStats(v.id, v.firstName, v.lastName, to_jsonarray(@@replyStatsAgg.get(v.id).tagNames), @@replyStatsAgg.get(v.id).replyCount); 62 | 63 | PRINT @@replyStatsTop; 64 | } 65 | -------------------------------------------------------------------------------- /tiger/queries/interactive_complex/ic_7.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ic_7(VERTEX personId) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE liker; 3 | //TYPEDEF TUPLE liker; 4 | HeapAccum(1, likeCreationDate DESC, commentOrPostId DESC) @mostRecentLike; 5 | OrAccum @valid = false; 6 | //SetAccum @@friendIds; 7 | HeapAccum(20, likeCreationDate DESC, personId ASC) @@likerTop; 8 | 9 | vPerson = { personId }; 10 | vMessage = 11 | SELECT t 12 | FROM vPerson:s-((Comment_HAS_CREATOR_Person_REVERSE|Post_HAS_CREATOR_Person_REVERSE):e)->(Comment|Post):t; 13 | 14 | vFriend = 15 | SELECT t 16 | FROM vPerson-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)-Person:t 17 | //ACCUM @@friendIds += t.id; 18 | ACCUM t.@valid = true; 19 | 20 | vLiker = 21 | SELECT t 22 | FROM vMessage:s-((Person_LIKES_Comment_REVERSE|Person_LIKES_Post_REVERSE):e)->Person:t 23 | ACCUM 24 | CASE 25 | WHEN s.type == "Comment" OR (s.type == "Post" AND s.content != "") THEN 26 | t.@mostRecentLike += liker(t.id, t.firstName, t.lastName, e.creationDate, s.id, s.content, s.creationDate, NOT t.@valid) 27 | //t.@mostRecentLike += liker(t.id, t.firstName, t.lastName, e.creationDate, s.id, s.content, s.creationDate, NOT @@friendIds.contains(t.id)) 28 | //t.@mostRecentLike += liker(t.id, t.firstName, t.lastName, e.creationDate, s.id, s.content, (datetime_diff(e.creationDate, s.creationDate) / 60), NOT @@friendIds.contains(t.id)) 29 | ELSE 30 | t.@mostRecentLike += liker(t.id, t.firstName, t.lastName, e.creationDate, s.id, s.imageFile, s.creationDate, NOT t.@valid) 31 | //t.@mostRecentLike += liker(t.id, t.firstName, t.lastName, e.creationDate, s.id, s.imageFile, s.creationDate, NOT @@friendIds.contains(t.id)) 32 | //t.@mostRecentLike += liker(t.id, t.firstName, t.lastName, e.creationDate, s.id, s.imageFile, (datetime_diff(e.creationDate, s.creationDate) / 60), NOT @@friendIds.contains(t.id)) 33 | END 34 | POST-ACCUM @@likerTop += t.@mostRecentLike.pop(); 35 | 36 | PRINT @@likerTop; 37 | } 38 | -------------------------------------------------------------------------------- /tiger/queries/interactive_short/is_2.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY is_2(VERTEX personId) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE replyInfo; 3 | TYPEDEF TUPLE opInfo; 4 | 5 | SetAccum> @@commentsRecent; 6 | SetAccum> @@postsRecent; 7 | SumAccum @authorOgId; 8 | SumAccum @authorOgFN, @authorOgLN; 9 | SetAccum @replies; 10 | HeapAccum(10, messageCreationDate DESC, messageId DESC) @@opInfoHeap; 11 | 12 | BOOL isPost; 13 | 14 | vPerson = { personId }; 15 | vMessage = 16 | SELECT t 17 | FROM vPerson:s-((Comment_HAS_CREATOR_Person_REVERSE|Post_HAS_CREATOR_Person_REVERSE):e)->(Comment|Post):t 18 | ORDER BY t.creationDate DESC, t.id DESC 19 | LIMIT 10; 20 | 21 | vMessage = 22 | SELECT v 23 | FROM vMessage:v 24 | ACCUM 25 | CASE 26 | WHEN v.type == "Comment" THEN 27 | @@commentsRecent += v 28 | WHEN v.type == "Post" AND v.content != "" THEN 29 | v.@replies += replyInfo(v.id, v.content, v.creationDate), 30 | @@postsRecent += v 31 | WHEN v.type == "Post" THEN 32 | v.@replies += replyInfo(v.id, v.imageFile, v.creationDate), 33 | @@postsRecent += v 34 | END; 35 | 36 | FOREACH c IN @@commentsRecent DO 37 | vRoot(Comment|Post) = {c}; 38 | isPost = False; 39 | WHILE isPost == False DO 40 | vRoot = 41 | SELECT t 42 | FROM vRoot:s-((Comment_REPLY_OF_Comment|Comment_REPLY_OF_Post):e)->(Comment|Post):t 43 | POST-ACCUM 44 | CASE WHEN t.type == "Post" THEN 45 | isPost = True, 46 | t.@replies += replyInfo(c.id, c.content, c.creationDate), 47 | @@postsRecent += t 48 | END; 49 | END; 50 | END; 51 | 52 | vMessage = { @@postsRecent }; 53 | vMessage = 54 | SELECT s 55 | FROM vMessage:s-(Post_HAS_CREATOR_Person:e)->Person:t 56 | ACCUM 57 | s.@authorOgId = t.id, 58 | s.@authorOgFN = t.firstName, 59 | s.@authorOgLN = t.lastName 60 | POST-ACCUM 61 | FOREACH ri IN s.@replies DO 62 | @@opInfoHeap += opInfo(ri.messageId, ri.messageContent, ri.messageCreationDate, s.id, s.@authorOgId, s.@authorOgFN, s.@authorOgLN) 63 | END; 64 | 65 | PRINT @@opInfoHeap; 66 | } 67 | -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_6.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_6(STRING tagName) FOR GRAPH ldbc_snb { 2 | 3 | SetAccum> @@personSet; 4 | SetAccum> @postSet; 5 | SetAccum> @commentSet; 6 | SetAccum @likedPerson; 7 | MapAccum> @@postLikedSet; 8 | MapAccum> @@commentLikedSet; 9 | SetAccum> @replied; 10 | SumAccum @likeCount; 11 | SumAccum @score; 12 | SumAccum @messageCount; 13 | 14 | vTag = {Tag.*}; 15 | vTag = 16 | SELECT s 17 | FROM vTag:s 18 | WHERE s.name == tagName; 19 | 20 | vPost = 21 | SELECT t 22 | FROM vTag:s-(Post_HAS_TAG_Tag_REVERSE:e)->:t; 23 | 24 | vComment = 25 | SELECT t 26 | FROM vTag:s-(Comment_HAS_TAG_Tag_REVERSE:e)->:t; 27 | 28 | vMessages = 29 | SELECT t 30 | FROM vTag:s-((Comment_HAS_TAG_Tag_REVERSE|Post_HAS_TAG_Tag_REVERSE):e)->:t; 31 | 32 | tmpPost = 33 | SELECT t 34 | FROM vPost:s-(Person_LIKES_Post_REVERSE:e)->Person:t 35 | ACCUM 36 | @@postLikedSet += (s.id -> t.id); 37 | 38 | tmpComment = 39 | SELECT t 40 | FROM vComment:s-(Person_LIKES_Comment_REVERSE:e)->Person:t 41 | ACCUM 42 | @@commentLikedSet += (s.id -> t.id); 43 | 44 | tmp1 = 45 | SELECT t 46 | FROM vMessages:s-((Comment_REPLY_OF_Comment_REVERSE|Comment_REPLY_OF_Post_REVERSE):e)->Comment:t 47 | ACCUM s.@replied += t; 48 | 49 | vPerson1 = 50 | SELECT t 51 | FROM vPost:s-(Post_HAS_CREATOR_Person:e)->:t 52 | ACCUM t.@likeCount += @@postLikedSet.get(s.id).size(), 53 | t.@replied += s.@replied, 54 | t.@postSet += s, 55 | @@personSet += t; 56 | 57 | vPerson2 = 58 | SELECT t 59 | FROM vComment:s-(Comment_HAS_CREATOR_Person:e)->:t 60 | ACCUM 61 | t.@likeCount += @@commentLikedSet.get(s.id).size(), 62 | t.@replied += s.@replied, 63 | t.@commentSet += s, 64 | @@personSet += t; 65 | 66 | vPersons = { @@personSet }; 67 | vPersons = 68 | SELECT s 69 | FROM vPersons:s 70 | ACCUM 71 | s.@messageCount = s.@postSet.size() + s.@commentSet.size(), 72 | s.@score = s.@postSet.size() + s.@commentSet.size() + 2*s.@replied.size() + 10 * s.@likeCount 73 | ORDER BY s.@score DESC, s.id ASC 74 | LIMIT 100; 75 | 76 | PRINT vPersons[vPersons.@replied.size() AS replyCount, vPersons.@likeCount AS likeCount, vPersons.@messageCount AS messageCount, vPersons.@score AS score]; 77 | } 78 | -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_16.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_16(VERTEX personId, STRING countryName, STRING tagClassName, INT minPathDistance, INT maxPathDistance) FOR GRAPH ldbc_snb { 2 | TYPEDEF tuple social; 3 | 4 | SumAccum @@counter = 1; 5 | SetAccum @visited; 6 | //SetAccum> @@personAll, @@personRange; 7 | OrAccum @valid = false; 8 | SetAccum> @@personRange; 9 | SumAccum @creatorId; 10 | SetAccum> @@tagSel; 11 | OrAccum @isValid; 12 | SetAccum @tagNames; 13 | GroupByAccum messageCount> @@socialGroup; 14 | HeapAccum(100, messageCount DESC, tag_name ASC, person_id ASC) @@socialTop; 15 | 16 | vCountry = { Country.* }; 17 | vCity = 18 | SELECT t 19 | FROM vCountry:s-(City_IS_PART_OF_Country_REVERSE:e)->City:t 20 | WHERE s.name == countryName; 21 | 22 | vPerson = 23 | SELECT t 24 | FROM vCity:s-(Person_IS_LOCATED_IN_City_REVERSE:e)->Person:t 25 | POST-ACCUM t.@valid = true; 26 | //POST-ACCUM @@personAll += t; 27 | 28 | vPerson = { personId }; 29 | WHILE @@counter <= maxPathDistance DO 30 | vPerson = 31 | SELECT t 32 | FROM vPerson:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)-Person:t 33 | WHERE NOT t.@visited.contains(s.id) 34 | ACCUM 35 | t.@visited += s.id, 36 | //CASE WHEN @@counter >= minPathDistance AND @@personAll.contains(t) THEN 37 | CASE WHEN @@counter >= minPathDistance AND t.@valid == true THEN 38 | @@personRange += t 39 | END; 40 | 41 | @@counter += 1; 42 | END; 43 | 44 | vPerson = { @@personRange }; 45 | vMessage = 46 | SELECT t 47 | FROM vPerson:s-((Comment_HAS_CREATOR_Person_REVERSE|Post_HAS_CREATOR_Person_REVERSE):e)->(Comment|Post):t 48 | ACCUM t.@creatorId += s.id; 49 | 50 | vTagClass = { TagClass.* }; 51 | vTag = 52 | SELECT t 53 | FROM vTagClass:s-(Tag_HAS_TYPE_TagClass_REVERSE:e)->Tag:t 54 | WHERE s.name == tagClassName 55 | ACCUM @@tagSel += t; 56 | 57 | vMessage = 58 | SELECT s 59 | FROM vMessage:s-((Comment_HAS_TAG_Tag|Post_HAS_TAG_Tag):e)->Tag:t 60 | ACCUM 61 | s.@tagNames += t.name, 62 | CASE WHEN @@tagSel.contains(t) THEN s.@isValid += True END 63 | POST-ACCUM 64 | CASE WHEN s.@isValid THEN 65 | FOREACH tn IN s.@tagNames DO 66 | @@socialGroup += (s.@creatorId, tn -> 1) 67 | END 68 | END; 69 | 70 | FOREACH (p,t,m) IN @@socialGroup DO 71 | @@socialTop += social(p, t, m); 72 | END; 73 | 74 | PRINT @@socialTop; 75 | } 76 | -------------------------------------------------------------------------------- /tiger/queries/helper/ExprFunctions.hpp: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | * Copyright (c) 2015-2016, TigerGraph Inc. 3 | * All rights reserved. 4 | * Project: TigerGraph Query Language 5 | * udf.hpp: a library of user defined functions used in queries. 6 | * 7 | * - This library should only define functions that will be used in 8 | * TigerGraph Query scripts. Other logics, such as structs and helper 9 | * functions that will not be directly called in the GQuery scripts, 10 | * must be put into "ExprUtil.hpp" under the same directory where 11 | * this file is located. 12 | * 13 | * - Supported type of return value and parameters 14 | * - int 15 | * - float 16 | * - double 17 | * - bool 18 | * - string (don't use std::string) 19 | * - accumulators 20 | * 21 | * - Function names are case sensitive, unique, and can't be conflict with 22 | * built-in math functions and reserve keywords. 23 | * 24 | * - Please don't remove necessary codes in this file 25 | * 26 | * - A backup of this file can be retrieved at 27 | * /dev_/gdk/gsql/src/QueryUdf/ExprFunctions.hpp 28 | * after upgrading the system. 29 | * 30 | ******************************************************************************/ 31 | 32 | #ifndef EXPRFUNCTIONS_HPP_ 33 | #define EXPRFUNCTIONS_HPP_ 34 | 35 | #include 36 | #include 37 | #include 38 | #include 39 | 40 | /** XXX Warning!! Put self-defined struct in ExprUtil.hpp ** 41 | * No user defined struct, helper functions (that will not be directly called 42 | * in the GQuery scripts) etc. are allowed in this file. This file only 43 | * contains user-defined expression function's signature and body. 44 | * Please put user defined structs, helper functions etc. in ExprUtil.hpp 45 | */ 46 | #include "ExprUtil.hpp" 47 | 48 | namespace UDIMPL { 49 | typedef std::string string; //XXX DON'T REMOVE 50 | 51 | /****** BIULT-IN FUNCTIONS **************/ 52 | /****** XXX DON'T REMOVE ****************/ 53 | inline int str_to_int (string str) { 54 | return atoi(str.c_str()); 55 | } 56 | 57 | inline int float_to_int (float val) { 58 | return (int) val; 59 | } 60 | 61 | inline string to_string (double val) { 62 | char result[200]; 63 | sprintf(result, "%g", val); 64 | return string(result); 65 | } 66 | 67 | // helper function for LDBC SNB 68 | inline string bigint_to_string (double val) { 69 | char result[200]; 70 | sprintf(result, "%.0f", val); 71 | return string(result); 72 | } 73 | } 74 | /****************************************/ 75 | 76 | #endif /* EXPRFUNCTIONS_HPP_ */ -------------------------------------------------------------------------------- /tiger/queries/interactive_complex/ic_3.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ic_3(VERTEX personId, STRING countryXName, STRING countryYName, DATETIME startDate, INT durationDays) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE fullName; 3 | TYPEDEF TUPLE msgStats; 4 | 5 | ListAccum> @@friendAll; 6 | OrAccum @visited; 7 | //SetAccum @@cityIds; 8 | OrAccum @valid = false; 9 | SumAccum @personId; 10 | MapAccum @@personNameMap; 11 | GroupByAccum xCount, SumAccum yCount> @@msgStatsGroup; 12 | HeapAccum(20, xyCount DESC, personId ASC) @@msgStatsTop; 13 | 14 | DATETIME endDate; 15 | INT i = 0; 16 | 17 | vPerson = { personId }; 18 | WHILE i < 2 DO 19 | vPerson = 20 | SELECT t 21 | FROM vPerson:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t 22 | WHERE t.@visited == False 23 | ACCUM 24 | s.@visited += True, 25 | t.@visited += True, 26 | @@friendAll += t; 27 | 28 | i = i + 1; 29 | END; 30 | 31 | vCountry = { Country.* }; 32 | vCountry = 33 | SELECT s 34 | FROM vCountry:s-(City_IS_PART_OF_Country_REVERSE:e)-City:t 35 | //ACCUM CASE WHEN s.name == countryXName OR s.name == countryYName THEN @@cityIds += t.id END; 36 | ACCUM CASE WHEN s.name == countryXName OR s.name == countryYName THEN t.@valid = true END; 37 | 38 | vFriend = { @@friendAll }; 39 | vFriend = 40 | SELECT s 41 | FROM vFriend:s-(Person_IS_LOCATED_IN_City:e)->City:t 42 | //WHERE NOT @@cityIds.contains(t.id); 43 | WHERE NOT t.@valid == true; 44 | 45 | endDate = datetime_add(startDate, INTERVAL durationDays DAY); 46 | 47 | vMessage = 48 | SELECT t 49 | FROM vFriend:s-((Comment_HAS_CREATOR_Person_REVERSE|Post_HAS_CREATOR_Person_REVERSE):e)->(Comment|Post):t 50 | WHERE startDate <= t.creationDate AND t.creationDate < endDate 51 | ACCUM t.@personId = s.id 52 | POST-ACCUM @@personNameMap += (s.id -> fullName(s.firstName, s.lastName)); 53 | 54 | vMessage = 55 | SELECT s 56 | FROM vMessage:s-((Comment_IS_LOCATED_IN_Country|Post_IS_LOCATED_IN_Country):e)->Country:t 57 | ACCUM 58 | CASE 59 | WHEN t.name == countryXName THEN 60 | @@msgStatsGroup += (s.@personId -> 1, 0) 61 | WHEN t.name == countryYName THEN 62 | @@msgStatsGroup += (s.@personId -> 0, 1) 63 | END; 64 | 65 | FOREACH (id,x,y) IN @@msgStatsGroup DO 66 | CASE WHEN NOT x == 0 AND NOT y == 0 THEN 67 | @@msgStatsTop += msgStats(id, @@personNameMap.get(id).firstName, @@personNameMap.get(id).lastName, x, y, (x + y)); 68 | END; 69 | END; 70 | 71 | PRINT @@msgStatsTop; 72 | } 73 | -------------------------------------------------------------------------------- /neo4j/load_scripts/import-to-neo4j.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #export NEO4J_HOME=/home/zhiyi/ecosys/neo4j-community-3.5.0 3 | #export NEO4J_DATA_DIR=/data/datasets/SF100/neo4j_convert 4 | #export NEO4J_DB_DIR=$NEO4J_HOME/data/databases/snb-1000.db 5 | #export POSTFIX=_0_0.csv 6 | 7 | $NEO4J_HOME/bin/neo4j-import --into $NEO4J_DB_DIR \ 8 | --id-type=INTEGER \ 9 | --nodes:Message:Comment "${NEO4J_DATA_DIR}/comment${POSTFIX}" \ 10 | --nodes:Forum "${NEO4J_DATA_DIR}/forum${POSTFIX}" \ 11 | --nodes:Organisation "${NEO4J_DATA_DIR}/organisation${POSTFIX}" \ 12 | --nodes:Person "${NEO4J_DATA_DIR}/person${POSTFIX}" \ 13 | --nodes:Place "${NEO4J_DATA_DIR}/place${POSTFIX}" \ 14 | --nodes:Message:Post "${NEO4J_DATA_DIR}/post${POSTFIX}" \ 15 | --nodes:TagClass "${NEO4J_DATA_DIR}/tagclass${POSTFIX}" \ 16 | --nodes:Tag "${NEO4J_DATA_DIR}/tag${POSTFIX}" \ 17 | --relationships:HAS_CREATOR "${NEO4J_DATA_DIR}/comment_hasCreator_person${POSTFIX}" \ 18 | --relationships:IS_LOCATED_IN "${NEO4J_DATA_DIR}/comment_isLocatedIn_place${POSTFIX}" \ 19 | --relationships:REPLY_OF "${NEO4J_DATA_DIR}/comment_replyOf_comment${POSTFIX}" \ 20 | --relationships:REPLY_OF "${NEO4J_DATA_DIR}/comment_replyOf_post${POSTFIX}" \ 21 | --relationships:CONTAINER_OF "${NEO4J_DATA_DIR}/forum_containerOf_post${POSTFIX}" \ 22 | --relationships:HAS_MEMBER "${NEO4J_DATA_DIR}/forum_hasMember_person${POSTFIX}" \ 23 | --relationships:HAS_MODERATOR "${NEO4J_DATA_DIR}/forum_hasModerator_person${POSTFIX}" \ 24 | --relationships:HAS_TAG "${NEO4J_DATA_DIR}/forum_hasTag_tag${POSTFIX}" \ 25 | --relationships:HAS_INTEREST "${NEO4J_DATA_DIR}/person_hasInterest_tag${POSTFIX}" \ 26 | --relationships:IS_LOCATED_IN "${NEO4J_DATA_DIR}/person_isLocatedIn_place${POSTFIX}" \ 27 | --relationships:KNOWS "${NEO4J_DATA_DIR}/person_knows_person${POSTFIX}" \ 28 | --relationships:LIKES "${NEO4J_DATA_DIR}/person_likes_comment${POSTFIX}" \ 29 | --relationships:LIKES "${NEO4J_DATA_DIR}/person_likes_post${POSTFIX}" \ 30 | --relationships:IS_PART_OF "${NEO4J_DATA_DIR}/place_isPartOf_place${POSTFIX}" \ 31 | --relationships:HAS_CREATOR "${NEO4J_DATA_DIR}/post_hasCreator_person${POSTFIX}" \ 32 | --relationships:HAS_TAG "${NEO4J_DATA_DIR}/comment_hasTag_tag${POSTFIX}" \ 33 | --relationships:HAS_TAG "${NEO4J_DATA_DIR}/post_hasTag_tag${POSTFIX}" \ 34 | --relationships:IS_LOCATED_IN "${NEO4J_DATA_DIR}/post_isLocatedIn_place${POSTFIX}" \ 35 | --relationships:IS_SUBCLASS_OF "${NEO4J_DATA_DIR}/tagclass_isSubclassOf_tagclass${POSTFIX}" \ 36 | --relationships:HAS_TYPE "${NEO4J_DATA_DIR}/tag_hasType_tagclass${POSTFIX}" \ 37 | --relationships:STUDY_AT "${NEO4J_DATA_DIR}/person_studyAt_organisation${POSTFIX}" \ 38 | --relationships:WORK_AT "${NEO4J_DATA_DIR}/person_workAt_organisation${POSTFIX}" \ 39 | --relationships:IS_LOCATED_IN "${NEO4J_DATA_DIR}/organisation_isLocatedIn_place${POSTFIX}" \ 40 | --delimiter '|' 41 | -------------------------------------------------------------------------------- /agens/run_is.py: -------------------------------------------------------------------------------- 1 | import random 2 | import sys 3 | import os 4 | import datetime 5 | from timeit import default_timer as timer 6 | 7 | from query_runner_new import * 8 | 9 | def run_i_short(name_data, param_path,i): 10 | #create result folder 11 | if not os.path.exists(os.path.dirname("./result/")): 12 | try: 13 | os.makedirs(os.path.dirname("./result/")) 14 | except OSError as exc: # Guard against race condition 15 | if exc.errno != errno.EEXIST: 16 | raise 17 | 18 | runner = AgensQueryRunner(); 19 | 20 | ofile = open("result/i_short" + "_" + str(i) +"_" + name_data, 'a') 21 | report = "\n---------- " + str(datetime.datetime.now()) + " " + " ----------\n" 22 | f_name = "interactive_0_0_is{}.csv".format(i) 23 | params_file = open(os.path.join(param_path, f_name), "r") 24 | params_list=[] 25 | for number, line in enumerate(params_file): 26 | p = line.strip() 27 | params_list.append(p) 28 | 29 | total_time = 0.0 30 | n = 0 31 | for j in range(len(params_list)): 32 | params = params_list[j] 33 | if i == 1: 34 | start = timer() 35 | runner.i_short_1(params) 36 | end = timer() 37 | elif i == 2: 38 | start = timer() 39 | runner.i_short_2(params) 40 | end = timer() 41 | elif i == 3: 42 | start = timer() 43 | runner.i_short_3(params) 44 | end = timer() 45 | elif i == 4: 46 | start = timer() 47 | runner.i_short_4(params) 48 | end = timer() 49 | elif i == 5: 50 | start = timer() 51 | runner.i_short_5(params) 52 | end = timer() 53 | elif i == 6: 54 | start = timer() 55 | runner.i_short_6(params) 56 | end = timer() 57 | elif i == 7: 58 | start = timer() 59 | runner.i_short_7(params) 60 | end = timer() 61 | elif i == 8: 62 | start = timer() 63 | runner.i_short_8(params) 64 | end = timer() 65 | exe_time = end - start 66 | if j != 0: 67 | total_time += exe_time 68 | #param = '|'.join(params) 69 | line = str(n)+": " +name_data + ", " + "i_short_"+str(i)+", " + params + ", " + str(exe_time) + " seconds" 70 | print(line) 71 | report += line + "\n" 72 | if n == 100: 73 | break; 74 | n += 1 75 | report += "summary, " + "i_short_"+str(i) + ", " + str(total_time/n) + " seconds\n" 76 | ofile.write(report) 77 | ofile.write("\n") 78 | print (report) 79 | 80 | 81 | if __name__ == "__main__": 82 | if len(sys.argv) < 4: 83 | print("Usage: python run_is.py data_name param_path query_index") 84 | sys.exit() 85 | run_i_short(os.path.basename(sys.argv[1]), sys.argv[2], int(sys.argv[3]) if len(sys.argv) == 4 else "") 86 | -------------------------------------------------------------------------------- /agens/run_ch.py: -------------------------------------------------------------------------------- 1 | import random 2 | import sys 3 | import os 4 | import datetime 5 | from timeit import default_timer as timer 6 | 7 | from query_runner_new import * 8 | 9 | def run_i_check(name_data, param_path,i): 10 | #create result folder 11 | if not os.path.exists(os.path.dirname("./result/")): 12 | try: 13 | os.makedirs(os.path.dirname("./result/")) 14 | except OSError as exc: # Guard against race condition 15 | if exc.errno != errno.EEXIST: 16 | raise 17 | 18 | runner = AgensQueryRunner(); 19 | 20 | ofile = open("result/i_check" + "_" + str(i) + "_" + name_data, 'a') 21 | report = "\n---------- " + str(datetime.datetime.now()) + " " + " ----------\n" 22 | f_name = "updateStream_0_0_ii{}.csv".format(i) 23 | params_file = open(os.path.join(param_path, f_name), "r") 24 | #header = next(params_file) 25 | params_list=[] 26 | count = 0 27 | for number, line in enumerate(params_file): 28 | p = line.strip().split('|') 29 | count += 1 30 | params_list.append(p) 31 | 32 | total_time = 0.0 33 | n = 0 34 | for j in range(len(params_list)): 35 | params = params_list[j] 36 | if i == 1: 37 | start = timer() 38 | runner.i_check_1(params) 39 | end = timer() 40 | elif i == 2: 41 | start = timer() 42 | runner.i_check_2(params) 43 | end = timer() 44 | elif i == 3: 45 | start = timer() 46 | runner.i_check_3(params) 47 | end = timer() 48 | elif i == 4: 49 | start = timer() 50 | runner.i_check_4(params) 51 | end = timer() 52 | elif i == 5: 53 | start = timer() 54 | runner.i_check_5(params) 55 | end = timer() 56 | elif i == 6: 57 | start = timer() 58 | runner.i_check_6(params) 59 | end = timer() 60 | elif i == 7: 61 | start = timer() 62 | runner.i_check_7(params) 63 | end = timer() 64 | elif i == 8: 65 | start = timer() 66 | runner.i_check_8(params) 67 | end = timer() 68 | exe_time = end - start 69 | if j!=0: 70 | total_time += exe_time 71 | #param = '|'.join(params) 72 | line = str(n)+": " +name_data + ", " + "i_check_"+str(i)+", " + params[0] + ", " + str(exe_time) + " seconds" 73 | print(line) 74 | report += line + "\n" 75 | if n == 100: 76 | break; 77 | n += 1 78 | report += "summary, " + "i_check_"+str(i) + ", " + str(total_time/n) + " seconds\n" 79 | ofile.write(report) 80 | ofile.write("\n") 81 | print (report) 82 | 83 | 84 | if __name__ == "__main__": 85 | if len(sys.argv) < 4: 86 | print("Usage: python run_ch.py data_name param_path query_index") 87 | sys.exit() 88 | run_i_check(os.path.basename(sys.argv[1]), sys.argv[2], int(sys.argv[3]) if len(sys.argv) == 4 else "") 89 | -------------------------------------------------------------------------------- /agens/run_id.py: -------------------------------------------------------------------------------- 1 | import random 2 | import sys 3 | import os 4 | import datetime 5 | from timeit import default_timer as timer 6 | 7 | from query_runner_new import * 8 | 9 | def run_i_delete(name_data, param_path,i): 10 | #create result folder 11 | if not os.path.exists(os.path.dirname("./result/")): 12 | try: 13 | os.makedirs(os.path.dirname("./result/")) 14 | except OSError as exc: # Guard against race condition 15 | if exc.errno != errno.EEXIST: 16 | raise 17 | 18 | runner = AgensQueryRunner(); 19 | 20 | ofile = open("result/i_delete" + "_" + str(i)+"_" + name_data, 'a') 21 | report = "\n---------- " + str(datetime.datetime.now()) + " " + " ----------\n" 22 | f_name = "updateStream_0_0_ii{}.csv".format(i) 23 | params_file = open(os.path.join(param_path, f_name), "r") 24 | #header = next(params_file) 25 | params_list=[] 26 | count = 0 27 | for number, line in enumerate(params_file): 28 | p = line.strip().split('|') 29 | count += 1 30 | params_list.append(p) 31 | 32 | total_time = 0.0 33 | n = 0 34 | for j in range(len(params_list)): 35 | params = params_list[j] 36 | if i == 1: 37 | start = timer() 38 | runner.i_delete_1(params) 39 | end = timer() 40 | elif i == 2: 41 | start = timer() 42 | runner.i_delete_2(params) 43 | end = timer() 44 | elif i == 3: 45 | start = timer() 46 | runner.i_delete_3(params) 47 | end = timer() 48 | elif i == 4: 49 | start = timer() 50 | runner.i_delete_4(params) 51 | end = timer() 52 | elif i == 5: 53 | start = timer() 54 | runner.i_delete_5(params) 55 | end = timer() 56 | elif i == 6: 57 | start = timer() 58 | runner.i_delete_6(params) 59 | end = timer() 60 | elif i == 7: 61 | start = timer() 62 | runner.i_delete_7(params) 63 | end = timer() 64 | elif i == 8: 65 | start = timer() 66 | runner.i_delete_8(params) 67 | end = timer() 68 | exe_time = end - start 69 | if j != 0: 70 | total_time += exe_time 71 | #param = '|'.join(params) 72 | line = str(n)+": " +name_data + ", " + "i_delete_"+str(i)+", " + params[0] + ", " + str(exe_time) + " seconds" 73 | print(line) 74 | report += line + "\n" 75 | if n == 100: 76 | break; 77 | n += 1 78 | report += "summary, " + "i_delete_"+str(i) + ", " + str(total_time/n) + " seconds\n" 79 | ofile.write(report) 80 | ofile.write("\n") 81 | print (report) 82 | 83 | 84 | if __name__ == "__main__": 85 | if len(sys.argv) < 4: 86 | print("Usage: python run_id.py data_name param_path query_index") 87 | sys.exit() 88 | run_i_delete(os.path.basename(sys.argv[1]), sys.argv[2], int(sys.argv[3]) if len(sys.argv) == 4 else "") 89 | -------------------------------------------------------------------------------- /neo4j/run_id.py: -------------------------------------------------------------------------------- 1 | import random 2 | import sys 3 | import os 4 | import datetime 5 | from timeit import default_timer as timer 6 | 7 | from query_runner_new import * 8 | 9 | def run_i_delete(name_data, param_path,i): 10 | #create result folder 11 | if not os.path.exists(os.path.dirname("./result/")): 12 | try: 13 | os.makedirs(os.path.dirname("./result/")) 14 | except OSError as exc: # Guard against race condition 15 | if exc.errno != errno.EEXIST: 16 | raise 17 | 18 | runner = Neo4jQueryRunner(); 19 | 20 | ofile = open("result/i_delete" + "_" + str(i)+"_" + name_data, 'a') 21 | report = "\n---------- " + str(datetime.datetime.now()) + " " + " ----------\n" 22 | f_name = "updateStream_0_0_ii{}.csv".format(i) 23 | params_file = open(os.path.join(param_path, f_name), "r") 24 | #header = next(params_file) 25 | params_list=[] 26 | count = 0 27 | for number, line in enumerate(params_file): 28 | p = line.strip().split('|') 29 | count += 1 30 | params_list.append(p) 31 | 32 | total_time = 0.0 33 | n = 0 34 | for j in range(len(params_list)): 35 | params = params_list[j] 36 | if i == 1: 37 | start = timer() 38 | runner.i_delete_1(params) 39 | end = timer() 40 | elif i == 2: 41 | start = timer() 42 | runner.i_delete_2(params) 43 | end = timer() 44 | elif i == 3: 45 | start = timer() 46 | runner.i_delete_3(params) 47 | end = timer() 48 | elif i == 4: 49 | start = timer() 50 | runner.i_delete_4(params) 51 | end = timer() 52 | elif i == 5: 53 | start = timer() 54 | runner.i_delete_5(params) 55 | end = timer() 56 | elif i == 6: 57 | start = timer() 58 | runner.i_delete_6(params) 59 | end = timer() 60 | elif i == 7: 61 | start = timer() 62 | runner.i_delete_7(params) 63 | end = timer() 64 | elif i == 8: 65 | start = timer() 66 | runner.i_delete_8(params) 67 | end = timer() 68 | exe_time = end - start 69 | if j != 0: 70 | total_time += exe_time 71 | #param = '|'.join(params) 72 | line = str(n)+": " +name_data + ", " + "i_delete_"+str(i)+", " + params[0] + ", " + str(exe_time) + " seconds" 73 | print(line) 74 | report += line + "\n" 75 | if n == 100: 76 | break; 77 | n += 1 78 | report += "summary, " + "i_delete_"+str(i)+ ", " + str(total_time/n) + " seconds\n" 79 | ofile.write(report) 80 | ofile.write("\n") 81 | print (report) 82 | 83 | 84 | if __name__ == "__main__": 85 | if len(sys.argv) < 4: 86 | print("Usage: python run_id.py data_name param_path query_index") 87 | sys.exit() 88 | run_i_delete(os.path.basename(sys.argv[1]), sys.argv[2], int(sys.argv[3]) if len(sys.argv) == 4 else "") 89 | -------------------------------------------------------------------------------- /neo4j/run_ch.py: -------------------------------------------------------------------------------- 1 | import random 2 | import sys 3 | import os 4 | import datetime 5 | from timeit import default_timer as timer 6 | 7 | from query_runner_new import * 8 | 9 | def run_i_check(name_data, param_path,i): 10 | #create result folder 11 | if not os.path.exists(os.path.dirname("./result/")): 12 | try: 13 | os.makedirs(os.path.dirname("./result/")) 14 | except OSError as exc: # Guard against race condition 15 | if exc.errno != errno.EEXIST: 16 | raise 17 | 18 | runner = Neo4jQueryRunner(); 19 | 20 | ofile = open("result/i_check" + "_" + str(i)+"_" + name_data, 'a') 21 | report = "\n---------- " + str(datetime.datetime.now()) + " " + " ----------\n" 22 | f_name = "updateStream_0_0_ii{}.csv".format(i) 23 | params_file = open(os.path.join(param_path, f_name), "r") 24 | #header = next(params_file) 25 | params_list=[] 26 | count = 0 27 | for number, line in enumerate(params_file): 28 | p = line.strip().split('|') 29 | count += 1 30 | params_list.append(p) 31 | 32 | total_time = 0.0 33 | n = 0 34 | for j in range(len(params_list)): 35 | params = params_list[j] 36 | n += 1 37 | if i == 1: 38 | start = timer() 39 | runner.i_check_1(params) 40 | end = timer() 41 | elif i == 2: 42 | start = timer() 43 | runner.i_check_2(params) 44 | end = timer() 45 | elif i == 3: 46 | start = timer() 47 | runner.i_check_3(params) 48 | end = timer() 49 | elif i == 4: 50 | start = timer() 51 | runner.i_check_4(params) 52 | end = timer() 53 | elif i == 5: 54 | start = timer() 55 | runner.i_check_5(params) 56 | end = timer() 57 | elif i == 6: 58 | start = timer() 59 | runner.i_check_6(params) 60 | end = timer() 61 | elif i == 7: 62 | start = timer() 63 | runner.i_check_7(params) 64 | end = timer() 65 | elif i == 8: 66 | start = timer() 67 | runner.i_check_8(params) 68 | end = timer() 69 | exe_time = end - start 70 | if j!=0: 71 | total_time += exe_time 72 | #param = '|'.join(params) 73 | line = str(n)+": " +name_data + ", " + "i_check_"+str(i)+", " + params[0] + ", " + str(exe_time) + " seconds" 74 | print(line) 75 | report += line + "\n" 76 | if n == 100: 77 | break; 78 | n += 1 79 | report += "summary, " + "i_check_"+str(i)+ ", " + str(total_time/n) + " seconds\n" 80 | ofile.write(report) 81 | ofile.write("\n") 82 | print (report) 83 | 84 | 85 | if __name__ == "__main__": 86 | if len(sys.argv) < 4: 87 | print("Usage: python run_ch.py data_name param_path query_index") 88 | sys.exit() 89 | run_i_check(os.path.basename(sys.argv[1]), sys.argv[2], int(sys.argv[3]) if len(sys.argv) == 4 else "") 90 | -------------------------------------------------------------------------------- /tiger/queries/interactive_complex/ic_1.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY ic_1(VERTEX personId, STRING firstName) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE v, INT distanceFromPerson, STRING lastName, INT id> friendInfo; 3 | TYPEDEF TUPLE org; 4 | 5 | HeapAccum(20, distanceFromPerson ASC, lastName ASC, id ASC) @@friendInfoTop; 6 | SetAccum> @@friendAll; 7 | SetAccum @comp, @univ; 8 | SumAccum @cityName; 9 | SumAccum @distance; 10 | MapAccum @personInfo; 11 | MapAccum> @@compInfo, @@univInfo; 12 | 13 | OrAccum @visited = False; 14 | INT i = 0; 15 | 16 | vPerson = { personId }; 17 | 18 | WHILE i < 3 DO 19 | vPerson = 20 | SELECT t 21 | FROM vPerson:s-((Person_KNOWS_Person|Person_KNOWS_Person_REVERSE):e)->Person:t 22 | WHERE t.@visited == False 23 | ACCUM 24 | s.@visited += True, 25 | t.@visited += True, 26 | t.@distance = (i+1) 27 | POST-ACCUM 28 | CASE WHEN t.firstName == firstName THEN 29 | @@friendInfoTop += friendInfo(t, t.@distance, t.lastName, t.id) 30 | END; 31 | 32 | IF @@friendInfoTop.size() >= 20 THEN BREAK; END; 33 | i = i + 1; 34 | END; 35 | 36 | FOREACH f IN @@friendInfoTop DO 37 | @@friendAll += f.v; 38 | END; 39 | 40 | vFriend = { @@friendAll }; 41 | vFriend = 42 | SELECT s 43 | FROM vFriend:s-(Person_IS_LOCATED_IN_City:e)->City:t 44 | ACCUM s.@cityName = t.name; 45 | 46 | vUniv = 47 | SELECT t 48 | FROM vFriend:s-(Person_STUDY_AT_University:e)->University:t 49 | ACCUM t.@personInfo += (s.id -> e.classYear); 50 | 51 | vUniv = 52 | SELECT s 53 | FROM vUniv:s-(University_IS_LOCATED_IN_City:e)->City:t 54 | ACCUM 55 | FOREACH (pId, orgYear) in s.@personInfo DO 56 | @@univInfo += (pId -> org(s.name, orgYear, t.name)) 57 | END; 58 | 59 | vComp = 60 | SELECT t 61 | FROM vFriend:s-(Person_WORK_AT_Company:e)->Company:t 62 | ACCUM t.@personInfo += (s.id -> e.workFrom); 63 | 64 | vComp = 65 | SELECT s 66 | FROM vComp:s-(Company_IS_LOCATED_IN_Country:e)->Country:t 67 | ACCUM 68 | FOREACH (pId, orgYear) in s.@personInfo DO 69 | @@compInfo += (pId -> org(s.name, orgYear, t.name)) 70 | END; 71 | 72 | vFriend = 73 | SELECT v 74 | FROM vFriend:v 75 | ACCUM 76 | v.@univ += @@univInfo.get(v.id), 77 | v.@comp += @@compInfo.get(v.id) 78 | ORDER BY v.@distance ASC, v.lastName ASC, v.id ASC; 79 | 80 | PRINT vFriend[ 81 | vFriend.id AS friendId, 82 | vFriend.lastName AS friendLastName, 83 | vFriend.@distance AS distanceFromPerson, 84 | vFriend.birthday AS friendBirthday, 85 | vFriend.creationDate AS friendCreationDate, 86 | vFriend.gender AS friendGender, 87 | vFriend.browserUsed AS friendBrowserUsed, 88 | vFriend.locationIP AS friendLocationIp, 89 | vFriend.email AS friendEmails, 90 | vFriend.speaks AS friendLanguages, 91 | vFriend.@cityName AS friendCityName, 92 | vFriend.@univ AS friendUniversities, 93 | vFriend.@comp AS friendCompanies]; 94 | } 95 | -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_19.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_19(DATETIME minDate, STRING tagClass1Name, STRING tagClass2Name) FOR GRAPH ldbc_snb { 2 | 3 | OrAccum @inTagClass1 = false; 4 | MinAccum @personId = 0; 5 | MinAccum @strangerId = 0; 6 | SetAccum @strangers; 7 | SetAccum @friends; 8 | SumAccum @interactionCount; 9 | 10 | Start(ANY) = {TagClass.*}; 11 | 12 | // Find stranger related to tagClass1 13 | Start = SELECT s 14 | FROM Start:s 15 | WHERE s.name == tagClass1Name; 16 | 17 | Start = SELECT t 18 | FROM Start:s - (Tag_HAS_TYPE_TagClass_REVERSE:e) -> :t; 19 | Start = SELECT t 20 | FROM Start:s - (Forum_HAS_TAG_Tag_REVERSE:e) -> :t; 21 | Start = SELECT t 22 | FROM Start:s - (Forum_HAS_MEMBER_Person:e) -> :t 23 | ACCUM t.@inTagClass1 = true; 24 | 25 | 26 | // Find stranger related to both tagClass1 and tagClass2 27 | Start = {TagClass.*}; 28 | Start = SELECT s 29 | FROM Start:s 30 | WHERE s.name == tagClass2Name; 31 | 32 | Start = SELECT t 33 | FROM Start:s - (Tag_HAS_TYPE_TagClass_REVERSE:e) -> :t; 34 | Start = SELECT t 35 | FROM Start:s - (Forum_HAS_TAG_Tag_REVERSE:e) -> :t; 36 | Strangers = SELECT t 37 | FROM Start:s - (Forum_HAS_MEMBER_Person:e) -> :t 38 | WHERE t.@inTagClass1 == true; 39 | 40 | // Get the persons 41 | Persons = {Person.*}; 42 | Persons = SELECT s 43 | FROM Persons:s 44 | WHERE s.birthday > minDate; 45 | // Mark the comments made by the persons 46 | Comments = SELECT t 47 | FROM Persons:s -(Comment_HAS_CREATOR_Person_REVERSE:e) -> :t 48 | ACCUM t.@personId = s.id; 49 | 50 | 51 | // For each message created by a stranger, store its only stranger in its MinAccum. 52 | Messages = SELECT t 53 | FROM Strangers:s - ((Comment_HAS_CREATOR_Person_REVERSE | Post_HAS_CREATOR_Person_REVERSE):e) -> :t 54 | ACCUM t.@strangerId = s.id; 55 | // Pass the strangerId down the tree 56 | WHILE(Messages.size() > 0) DO 57 | Messages = SELECT t 58 | FROM Messages:s - ((Comment_REPLY_OF_Post_REVERSE | Comment_REPLY_OF_Comment_REVERSE):e) -> :t 59 | ACCUM t.@strangerId = s.@strangerId; 60 | END; 61 | 62 | // Only keep the Comments by Persons which have interaction with strangers 63 | Comments = SELECT s 64 | FROM Comments:s 65 | WHERE s.@strangerId != 0 AND s.@strangerId != s.@personId; 66 | 67 | // Store the friends of each person in a local SetAccum 68 | Persons = SELECT s 69 | FROM Persons:s - (Person_KNOWS_Person:e) -> :t 70 | ACCUM s.@friends += t.id; 71 | // Build a map to store which strangers interacted with each person 72 | Persons = SELECT t 73 | FROM Comments:s - (Comment_HAS_CREATOR_Person:e) -> :t 74 | ACCUM IF NOT s.@strangerId IN t.@friends THEN // they do not know each other 75 | t.@strangers += s.@strangerId, 76 | t.@interactionCount += 1 77 | END 78 | ORDER BY t.@interactionCount DESC, t.id ASC 79 | LIMIT 100; 80 | 81 | PRINT Persons[Persons.id AS personId, Persons.@strangers.size() AS strangerCount, Persons.@interactionCount AS interactionCount]; 82 | 83 | } 84 | -------------------------------------------------------------------------------- /tiger/queries/install_queries.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ############################################################ 3 | # Copyright (c) 2015-now, TigerGraph Inc. 4 | # All rights reserved 5 | # It is provided as it is for benchmark reproducible purpose. 6 | # anyone can use it for benchmark purpose with the 7 | # acknowledgement to TigerGraph. 8 | ############################################################ 9 | 10 | ############################################################ 11 | # The orginal script is provided by TigerGraph. 12 | # We add and modify some code 13 | # to adapt this benchmark to our experiment. 14 | # The modified part is noted with 'By rwang:......' 15 | ############################################################ 16 | 17 | gsql_cmd="gsql -g ldbc_snb" 18 | tmp_gsql=".tmp.gsql" 19 | 20 | function get_install_str_body { 21 | is_first=1 22 | body="" 23 | for f in $1/*.gsql 24 | do 25 | cat $f >> $tmp_gsql 26 | echo "" >> $tmp_gsql 27 | 28 | fn=$(basename $f) 29 | if [ $is_first -eq "1" ]; then 30 | is_first=0 31 | else 32 | body="$body, " 33 | fi 34 | body="$body ${fn%.gsql}" 35 | done 36 | echo $body 37 | } 38 | 39 | # add bigint_to_string function and back up original ExprFunctions.hpp 40 | echo "[STEP 1 ] Add an user-defined function." 41 | is_valid_user=0 42 | if [ -d "$HOME/.gium" ]; then 43 | udf_file="$( dirname $( readlink "$HOME/.gium" ) )/dev/gdk/gsql/src/QueryUdf/ExprFunctions.hpp" 44 | if [ -f $udf_file ]; then 45 | is_valid_user=1 46 | fi 47 | fi 48 | if [ $is_valid_user -ne "1" ]; then 49 | echo "[ERROR ] Can't add the user-defined function. Please make sure that you can run TigerGraph with the current user." 50 | exit 1 51 | fi 52 | cmp $udf_file "helper/ExprFunctions.hpp" >/dev/null 2>&1 53 | if [ $? -ne 0 ]; then 54 | need_bak=1 55 | udf_bak=$( ls -1 $udf_file.* 2>/dev/null | sort -r | head -1 ) 56 | if [ ! -z $udf_bak ] && [ -f $udf_bak ]; then 57 | cmp $udf_file $udf_bak >/dev/null 2>&1 58 | if [ $? -eq 0 ]; then 59 | need_bak=0 60 | fi 61 | fi 62 | if [ $need_bak -eq "1" ]; then 63 | echo "[INFO ] Backing up existing ExprFunctions.hpp" 64 | cp $udf_file "$udf_file.$( date "+%Y-%m-%d_%H-%M-%S" )" 65 | fi 66 | cp helper/ExprFunctions.hpp $udf_file 67 | gadmin restart gsql -y 68 | fi 69 | 70 | # drop all queries 71 | echo "[STEP 2 ] Drop all existing queries." 72 | $gsql_cmd "DROP QUERY *" 73 | 74 | # install helper queries 75 | echo "[STEP 3 ] Install helper queries." 76 | touch $tmp_gsql 77 | > $tmp_gsql 78 | install_str="INSTALL QUERY" 79 | body_help=$( get_install_str_body "$PWD/helper" ) 80 | install_str="$install_str $body_help" 81 | echo $install_str >> $tmp_gsql 82 | 83 | $gsql_cmd $tmp_gsql 84 | 85 | # install benchmark queries 86 | echo "[STEP 4 ] Install LDBC SNB queries." 87 | > $tmp_gsql 88 | install_str="INSTALL QUERY" 89 | body_is=$( get_install_str_body "$PWD/interactive_short" ) 90 | body_ic=$( get_install_str_body "$PWD/interactive_complex" ) 91 | body_bi=$( get_install_str_body "$PWD/business_intelligence" ) 92 | body_ii=$( get_install_str_body "$PWD/interactive_insert" ) 93 | install_str="$install_str $body_is, $body_ic, $body_bi, $body_ii" 94 | echo $install_str >> $tmp_gsql 95 | 96 | $gsql_cmd $tmp_gsql 97 | 98 | # remove .tmp.gsql 99 | rm $tmp_gsql 100 | -------------------------------------------------------------------------------- /tiger/load_scripts/load_data.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ############################################################ 4 | # Copyright (c) 2015-now, TigerGraph Inc. 5 | # All rights reserved 6 | # It is provided as it is for benchmark reproducible purpose. 7 | # anyone can use it for benchmark purpose with the 8 | # acknowledgement to TigerGraph. 9 | # Author: Litong Shen litong.shen@tigergraph.com 10 | ############################################################ 11 | 12 | # export LDBC_SNB_DATA_DIR=/home/tigergraph/ldbc_snb_data/social_network/ 13 | # export LDBC_SNB_DATA_POSTFIX=_0_0.csv 14 | 15 | gsql -g ldbc_snb "run loading job load_ldbc_snb using 16 | v_person_file=\"${LDBC_SNB_DATA_DIR}/person${LDBC_SNB_DATA_POSTFIX}\", 17 | v_post_file=\"${LDBC_SNB_DATA_DIR}/post${LDBC_SNB_DATA_POSTFIX}\", 18 | v_tag_file=\"${LDBC_SNB_DATA_DIR}/tag${LDBC_SNB_DATA_POSTFIX}\", 19 | v_place_file=\"${LDBC_SNB_DATA_DIR}/place${LDBC_SNB_DATA_POSTFIX}\", 20 | v_comment_file=\"${LDBC_SNB_DATA_DIR}/comment${LDBC_SNB_DATA_POSTFIX}\", 21 | v_forum_file=\"${LDBC_SNB_DATA_DIR}/forum${LDBC_SNB_DATA_POSTFIX}\", 22 | v_organisation_file=\"${LDBC_SNB_DATA_DIR}/organisation${LDBC_SNB_DATA_POSTFIX}\", 23 | v_tagclass_file=\"${LDBC_SNB_DATA_DIR}/tagclass${LDBC_SNB_DATA_POSTFIX}\", 24 | 25 | person_knows_person_file=\"${LDBC_SNB_DATA_DIR}/person_knows_person${LDBC_SNB_DATA_POSTFIX}\", 26 | comment_replyOf_post_file=\"${LDBC_SNB_DATA_DIR}/comment_replyOf_post${LDBC_SNB_DATA_POSTFIX}\", 27 | comment_replyOf_comment_file=\"${LDBC_SNB_DATA_DIR}/comment_replyOf_comment${LDBC_SNB_DATA_POSTFIX}\", 28 | post_hasCreator_person_file=\"${LDBC_SNB_DATA_DIR}/post_hasCreator_person${LDBC_SNB_DATA_POSTFIX}\", 29 | post_hasTag_tag_file=\"${LDBC_SNB_DATA_DIR}/post_hasTag_tag${LDBC_SNB_DATA_POSTFIX}\", 30 | comment_hasCreator_person_file=\"${LDBC_SNB_DATA_DIR}/comment_hasCreator_person${LDBC_SNB_DATA_POSTFIX}\", 31 | post_isLocatedIn_place_file=\"${LDBC_SNB_DATA_DIR}/post_isLocatedIn_place${LDBC_SNB_DATA_POSTFIX}\", 32 | comment_hasTag_tag_file=\"${LDBC_SNB_DATA_DIR}/comment_hasTag_tag${LDBC_SNB_DATA_POSTFIX}\", 33 | comment_isLocatedIn_place_file=\"${LDBC_SNB_DATA_DIR}/comment_isLocatedIn_place${LDBC_SNB_DATA_POSTFIX}\", 34 | forum_containerOf_post_file=\"${LDBC_SNB_DATA_DIR}/forum_containerOf_post${LDBC_SNB_DATA_POSTFIX}\", 35 | forum_hasMember_person_file=\"${LDBC_SNB_DATA_DIR}/forum_hasMember_person${LDBC_SNB_DATA_POSTFIX}\", 36 | forum_hasModerator_person_file=\"${LDBC_SNB_DATA_DIR}/forum_hasModerator_person${LDBC_SNB_DATA_POSTFIX}\", 37 | forum_hasTag_tag_file=\"${LDBC_SNB_DATA_DIR}/forum_hasTag_tag${LDBC_SNB_DATA_POSTFIX}\", 38 | organisation_isLocatedIn_place_file=\"${LDBC_SNB_DATA_DIR}/organisation_isLocatedIn_place${LDBC_SNB_DATA_POSTFIX}\", 39 | person_hasInterest_tag_file=\"${LDBC_SNB_DATA_DIR}/person_hasInterest_tag${LDBC_SNB_DATA_POSTFIX}\", 40 | person_isLocatedIn_place_file=\"${LDBC_SNB_DATA_DIR}/person_isLocatedIn_place${LDBC_SNB_DATA_POSTFIX}\", 41 | person_likes_comment_file=\"${LDBC_SNB_DATA_DIR}/person_likes_comment${LDBC_SNB_DATA_POSTFIX}\", 42 | person_likes_post_file=\"${LDBC_SNB_DATA_DIR}/person_likes_post${LDBC_SNB_DATA_POSTFIX}\", 43 | person_studyAt_organisation_file=\"${LDBC_SNB_DATA_DIR}/person_studyAt_organisation${LDBC_SNB_DATA_POSTFIX}\", 44 | person_workAt_organisation_file=\"${LDBC_SNB_DATA_DIR}/person_workAt_organisation${LDBC_SNB_DATA_POSTFIX}\", 45 | place_isPartOf_place_file=\"${LDBC_SNB_DATA_DIR}/place_isPartOf_place${LDBC_SNB_DATA_POSTFIX}\", 46 | tag_hasType_tagclass_file=\"${LDBC_SNB_DATA_DIR}/tag_hasType_tagclass${LDBC_SNB_DATA_POSTFIX}\", 47 | tagclass_isSubclassOf_tagclass_file=\"${LDBC_SNB_DATA_DIR}/tagclass_isSubclassOf_tagclass${LDBC_SNB_DATA_POSTFIX}\"" 48 | -------------------------------------------------------------------------------- /tiger/queries/business_intelligence/bi_11.gsql: -------------------------------------------------------------------------------- 1 | CREATE QUERY bi_11(STRING countryName, set blacklist) FOR GRAPH ldbc_snb { 2 | TYPEDEF TUPLE reply; 3 | 4 | SetAccum @@blacklistP; 5 | AndAccum @isValid; 6 | SumAccum @creatorId; 7 | SetAccum> @@validComments; 8 | SetAccum> @@replyAll; 9 | SetAccum @tagNames; 10 | SumAccum @likeCount; 11 | GroupByAccum likeCount, SumAccum replyCount> @@replyGroup; 12 | HeapAccum(100, likeCount DESC, personId ASC, tagName ASC) @@replyTop; 13 | 14 | SetAccum @postTagSet2; 15 | SetAccum @commentTagSet2; 16 | SetAccum @replyTagSet2; 17 | OrAccum @valid = false; 18 | //SetAccum @@invalidReplySet; 19 | 20 | FOREACH word IN blacklist DO 21 | @@blacklistP += ("%" + word + "%"); 22 | END; 23 | 24 | vCountry = { Country.* }; 25 | vCity = 26 | SELECT t 27 | FROM vCountry:s-(City_IS_PART_OF_Country_REVERSE:e)->City:t 28 | WHERE s.name == countryName; 29 | 30 | vPerson = 31 | SELECT t 32 | FROM vCity:s-(Person_IS_LOCATED_IN_City_REVERSE:e)->Person:t; 33 | 34 | vComments = 35 | SELECT t 36 | FROM vPerson:s-(Comment_HAS_CREATOR_Person_REVERSE:e)->Comment:t 37 | ACCUM 38 | t.@creatorId = s.id, 39 | FOREACH word IN @@blacklistP DO 40 | CASE WHEN t.content LIKE word THEN 41 | t.@isValid += False, 42 | BREAK 43 | END 44 | END 45 | POST-ACCUM CASE WHEN t.@isValid THEN @@validComments += t END; 46 | 47 | vComments = { @@validComments }; 48 | vMessage = 49 | SELECT t 50 | FROM vComments:s-((Comment_REPLY_OF_Comment|Comment_REPLY_OF_Post):e)->(Comment|Post):t 51 | POST-ACCUM @@replyAll += s; 52 | 53 | vReply = { @@replyAll }; 54 | 55 | vComment = 56 | SELECT t 57 | FROM vReply:s-(Comment_REPLY_OF_Comment:e)->Comment:t; 58 | 59 | vPost = 60 | SELECT t 61 | FROM vReply:s-(Comment_REPLY_OF_Post:e)->Post:t; 62 | 63 | vCommentTag = 64 | SELECT t 65 | FROM vComment:s-(Comment_HAS_TAG_Tag:e)->Tag:t 66 | ACCUM s.@commentTagSet2 += t.id; 67 | 68 | vPostTag = 69 | SELECT t 70 | FROM vPost:s-(Post_HAS_TAG_Tag:e)->Tag:t 71 | ACCUM s.@postTagSet2 += t.id; 72 | 73 | vComment = 74 | SELECT t 75 | FROM vReply:s-(Comment_REPLY_OF_Comment:e)->Comment:t 76 | ACCUM s.@replyTagSet2 += t.@commentTagSet2; 77 | 78 | vPost = 79 | SELECT t 80 | FROM vReply:s-(Comment_REPLY_OF_Post:e)->Post:t 81 | ACCUM s.@replyTagSet2 += t.@postTagSet2; 82 | 83 | vReply2 = 84 | SELECT s 85 | FROM vReply:s-(Comment_HAS_TAG_Tag:e)->Tag:t 86 | WHERE s.@replyTagSet2.contains(t.id) 87 | ACCUM s.@valid = true; 88 | //ACCUM @@invalidReplySet += s.id; 89 | 90 | vReply = 91 | SELECT s 92 | FROM vReply:s 93 | WHERE NOT s.@valid; 94 | //WHERE NOT @@invalidReplySet.contains(s.id); 95 | 96 | vComments = 97 | SELECT s 98 | FROM vReply:s-(Comment_HAS_TAG_Tag:e)->Tag:t 99 | ACCUM s.@tagNames += t.name; 100 | 101 | vReply = 102 | SELECT s 103 | FROM vReply:s-(Person_LIKES_Comment_REVERSE:e)->Person:t 104 | ACCUM s.@likeCount += 1 105 | POST-ACCUM 106 | FOREACH tn IN s.@tagNames DO 107 | @@replyGroup += (s.@creatorId, tn -> s.@likeCount, 1) 108 | END; 109 | 110 | FOREACH (p,t,l,r) IN @@replyGroup DO 111 | @@replyTop += reply(p,t,l,r); 112 | END; 113 | 114 | PRINT @@replyTop; 115 | } 116 | -------------------------------------------------------------------------------- /light/run_is.py: -------------------------------------------------------------------------------- 1 | import random 2 | import sys 3 | import os 4 | import datetime 5 | import pycurl, json 6 | from timeit import default_timer as timer 7 | 8 | from lgraph_query_runner import * 9 | 10 | format = 'Content-Type:application/json;charset=utf-8' 11 | login_url = "http://127.0.0.1:7071/login" 12 | login_usr = json.dumps({"user": "admin", "password":"admin123456"}) 13 | login_head = [format] 14 | 15 | query_url = "http://127.0.0.1:7071/cypher" 16 | 17 | def get_jwt(): 18 | c = pycurl.Curl() 19 | c.setopt(pycurl.URL, login_url) 20 | c.setopt(pycurl.POST, 1) 21 | c.setopt(pycurl.HTTPHEADER, login_head) 22 | c.setopt(pycurl.POSTFIELDS, login_usr) 23 | result = c.perform_rb() 24 | result = json.loads(result) 25 | jwt = result["jwt"] 26 | return jwt 27 | 28 | def run_single(jwt, query): 29 | auth = 'Authorization:Bearer '+jwt 30 | head = [format,auth] 31 | c = pycurl.Curl() 32 | c.setopt(pycurl.URL, query_url) 33 | c.setopt(pycurl.POST, 1) 34 | c.setopt(pycurl.HTTPHEADER, head) 35 | data = json.dumps({"graph":"default", "script":query}) 36 | c.setopt(pycurl.POSTFIELDS, data) 37 | result = c.perform_rb() 38 | c.close() 39 | result = json.loads(result) 40 | print(result) 41 | t = result["elapsed"] 42 | #header = result["header"] 43 | #output = result["result"] 44 | return float(t) 45 | 46 | def run_i_short(name_data, param_path,i): 47 | #create result folder 48 | if not os.path.exists(os.path.dirname("./result/")): 49 | try: 50 | os.makedirs(os.path.dirname("./result/")) 51 | except OSError as exc: # Guard against race condition 52 | if exc.errno != errno.EEXIST: 53 | raise 54 | 55 | ofile = open("result/i_short" + "_" + str(i) +"_" + name_data, 'a') 56 | report = "\n---------- " + str(datetime.datetime.now()) + " " + " ----------\n" 57 | f_name = "interactive_0_0_is{}.csv".format(i) 58 | params_file = open(os.path.join(param_path, f_name), "r") 59 | params_list=[] 60 | for number, line in enumerate(params_file): 61 | p = line.strip() 62 | params_list.append(p) 63 | 64 | total_time = 0.0 65 | n = 0 66 | jwt = get_jwt() 67 | for j in range(len(params_list)): 68 | params = params_list[j] 69 | if i == 1: 70 | query = is_1(params) 71 | elif i == 2: 72 | query = is_2(params) 73 | elif i == 3: 74 | query = is_3(params) 75 | elif i == 4: 76 | query = is_4(params) 77 | elif i == 5: 78 | query = is_5(params) 79 | elif i == 6: 80 | query = is_6(params) 81 | elif i == 7: 82 | query = is_7(params) 83 | elif i == 8: 84 | query = is_8(params) 85 | t = run_single(jwt,query) 86 | exe_time = t 87 | if j != 0: 88 | total_time += exe_time 89 | #param = '|'.join(params) 90 | line = str(n)+": " +name_data + ", " + "i_short_"+str(i)+", " + params + ", " + str(exe_time) + " seconds" 91 | print(line) 92 | report += line + "\n" 93 | if n == 100: 94 | break; 95 | n += 1 96 | report += "summary, " + "i_short_"+str(i) + ", " + str(total_time/n) + " seconds\n" 97 | ofile.write(report) 98 | ofile.write("\n") 99 | print (report) 100 | 101 | 102 | if __name__ == "__main__": 103 | if len(sys.argv) < 4: 104 | print("Usage: python run_is.py data_name param_path query_index") 105 | sys.exit() 106 | run_i_short(os.path.basename(sys.argv[1]), sys.argv[2], int(sys.argv[3]) if len(sys.argv) == 4 else "") 107 | -------------------------------------------------------------------------------- /light/load_scripts/data_import.conf: -------------------------------------------------------------------------------- 1 | [comment_0_0.csv] 2 | LABEL=Comment 3 | id:INT64:ID,creationDate:INT64,locationIP:STRING,browserUsed:STRING,content:STRING:OPTIONAL,length:INT16 4 | [forum_0_0.csv] 5 | LABEL=Forum 6 | id:INT64:ID,title:STRING,creationDate:INT64 7 | [organisation_0_0.csv] 8 | LABEL=Organisation 9 | id:INT64:ID,label:STRING,name:STRING,url:STRING 10 | [person_0_0.csv] 11 | LABEL=Person 12 | id:INT64:ID,firstName:STRING,lastName:STRING,gender:STRING,birthday:INT64,creationDate:INT64,locationIP:STRING,browserUsed:STRING,languages:STRING,emails:STRING 13 | [place_0_0.csv] 14 | LABEL=Place 15 | id:INT64:ID,name:STRING,url:STRING,label:STRING 16 | [post_0_0.csv] 17 | LABEL=Post 18 | id:INT64:ID,imageFile:STRING:OPTIONAL,creationDate:INT64,locationIP:STRING,browserUsed:STRING,languages:STRING:OPTIONAL,content:STRING:OPTIONAL,length:INT16 19 | [tag_0_0.csv] 20 | LABEL=Tag 21 | id:INT64:ID,name:STRING,url:STRING 22 | [tagclass_0_0.csv] 23 | LABEL=TagClass 24 | id:INT64:ID,name:STRING,url:STRING 25 | 26 | [comment_hasCreator_person_0_0.csv] 27 | LABEL=HAS_CREATOR,SRC_ID=Comment:id,DST_ID=Person:id 28 | id1:INT64:SRC_ID,id2:INT64:DST_ID 29 | [comment_hasTag_tag_0_0.csv] 30 | LABEL=HAS_TAG,SRC_ID=Comment:id,DST_ID=Tag:id 31 | id1:INT64:SRC_ID,id2:INT64:DST_ID 32 | [comment_isLocatedIn_place_0_0.csv] 33 | LABEL=IS_LOCATED_IN,SRC_ID=Comment:id,DST_ID=Place:id 34 | id1:INT64:SRC_ID,id2:INT64:DST_ID 35 | [comment_replyOf_comment_0_0.csv] 36 | LABEL=REPLY_OF,SRC_ID=Comment:id,DST_ID=Comment:id 37 | id1:INT64:SRC_ID,id2:INT64:DST_ID 38 | [comment_replyOf_post_0_0.csv] 39 | LABEL=REPLY_OF,SRC_ID=Comment:id,DST_ID=Post:id 40 | id1:INT64:SRC_ID,id2:INT64:DST_ID 41 | [forum_containerOf_post_0_0.csv] 42 | LABEL=CONTAINER_OF,SRC_ID=Forum:id,DST_ID=Post:id 43 | id1:INT64:SRC_ID,id2:INT64:DST_ID 44 | [forum_hasMember_person_0_0.csv] 45 | LABEL=HAS_MEMBER,SRC_ID=Forum:id,DST_ID=Person:id 46 | id1:INT64:SRC_ID,id2:INT64:DST_ID,joinDate:INT64 47 | [forum_hasModerator_person_0_0.csv] 48 | LABEL=HAS_MODERATOR,SRC_ID=Forum:id,DST_ID=Person:id 49 | id1:INT64:SRC_ID,id2:INT64:DST_ID 50 | [forum_hasTag_tag_0_0.csv] 51 | LABEL=HAS_TAG,SRC_ID=Forum:id,DST_ID=Tag:id 52 | id1:INT64:SRC_ID,id2:INT64:DST_ID 53 | [organisation_isLocatedIn_place_0_0.csv] 54 | LABEL=IS_LOCATED_IN,SRC_ID=Organisation:id,DST_ID=Place:id 55 | id1:INT64:SRC_ID,id2:INT64:DST_ID 56 | [person_hasInterest_tag_0_0.csv] 57 | LABEL=HAS_INTEREST,SRC_ID=Person:id,DST_ID=Tag:id 58 | id1:INT64:SRC_ID,id2:INT64:DST_ID 59 | [person_isLocatedIn_place_0_0.csv] 60 | LABEL=IS_LOCATED_IN,SRC_ID=Person:id,DST_ID=Place:id 61 | id1:INT64:SRC_ID,id2:INT64:DST_ID 62 | [person_knows_person_0_0.csv] 63 | LABEL=KNOWS,SRC_ID=Person:id,DST_ID=Person:id 64 | id1:INT64:SRC_ID,id2:INT64:DST_ID,creationDate:INT64 65 | [person_likes_comment_0_0.csv] 66 | LABEL=LIKES,SRC_ID=Person:id,DST_ID=Comment:id 67 | id1:INT64:SRC_ID,id2:INT64:DST_ID,creationDate:INT64 68 | [person_likes_post_0_0.csv] 69 | LABEL=LIKES,SRC_ID=Person:id,DST_ID=Post:id 70 | id1:INT64:SRC_ID,id2:INT64:DST_ID,creationDate:INT64 71 | [person_studyAt_organisation_0_0.csv] 72 | LABEL=STUDY_AT,SRC_ID=Person:id,DST_ID=Organisation:id 73 | id1:INT64:SRC_ID,id2:INT64:DST_ID,classYear:INT16 74 | [person_workAt_organisation_0_0.csv] 75 | LABEL=WORK_AT,SRC_ID=Person:id,DST_ID=Organisation:id 76 | id1:INT64:SRC_ID,id2:INT64:DST_ID,workFrom:INT16 77 | [place_isPartOf_place_0_0.csv] 78 | LABEL=IS_PART_OF,SRC_ID=Place:id,DST_ID=Place:id 79 | id1:INT64:SRC_ID,id2:INT64:DST_ID 80 | [post_hasCreator_person_0_0.csv] 81 | LABEL=HAS_CREATOR,SRC_ID=Post:id,DST_ID=Person:id 82 | id1:INT64:SRC_ID,id2:INT64:DST_ID 83 | [post_hasTag_tag_0_0.csv] 84 | LABEL=HAS_TAG,SRC_ID=Post:id,DST_ID=Tag:id 85 | id1:INT64:SRC_ID,id2:INT64:DST_ID 86 | [post_isLocatedIn_place_0_0.csv] 87 | LABEL=IS_LOCATED_IN,SRC_ID=Post:id,DST_ID=Place:id 88 | id1:INT64:SRC_ID,id2:INT64:DST_ID 89 | [tagclass_isSubclassOf_tagclass_0_0.csv] 90 | LABEL=IS_SUBCLASS_OF,SRC_ID=TagClass:id,DST_ID=TagClass:id 91 | id1:INT64:SRC_ID,id2:INT64:DST_ID 92 | [tag_hasType_tagclass_0_0.csv] 93 | LABEL=HAS_TYPE,SRC_ID=Tag:id,DST_ID=TagClass:id 94 | id1:INT64:SRC_ID,id2:INT64:DST_ID -------------------------------------------------------------------------------- /light/run_ch.py: -------------------------------------------------------------------------------- 1 | import random 2 | import sys 3 | import os 4 | import datetime 5 | import pycurl, json 6 | from timeit import default_timer as timer 7 | 8 | from lgraph_query_runner import * 9 | 10 | format = 'Content-Type:application/json;charset=utf-8' 11 | login_url = "http://localhost:7071/login" 12 | login_usr = json.dumps({"user": "admin", "password":"admin123456"}) 13 | login_head = [format] 14 | 15 | query_url = "http://127.0.0.1:7071/cypher" 16 | 17 | def get_jwt(): 18 | c = pycurl.Curl() 19 | c.setopt(pycurl.URL, login_url) 20 | c.setopt(pycurl.POST, 1) 21 | c.setopt(pycurl.HTTPHEADER, login_head) 22 | c.setopt(pycurl.POSTFIELDS, login_usr) 23 | result = c.perform_rb() 24 | result = json.loads(result) 25 | jwt = result["jwt"] 26 | return jwt 27 | 28 | def check(jwt, query): 29 | auth = 'Authorization:Bearer '+jwt 30 | head = [format,auth] 31 | c = pycurl.Curl() 32 | c.setopt(pycurl.URL, query_url) 33 | c.setopt(pycurl.POST, 1) 34 | c.setopt(pycurl.HTTPHEADER, head) 35 | data = json.dumps({"graph":"default", "script":query}) 36 | c.setopt(pycurl.POSTFIELDS, data) 37 | result = c.perform_rb() 38 | c.close() 39 | result = json.loads(result) 40 | print(result) 41 | time = result["elapsed"] 42 | return float(time) 43 | 44 | def run_i_check(name_data, param_path,i): 45 | #create result folder 46 | if not os.path.exists(os.path.dirname("./result/")): 47 | try: 48 | os.makedirs(os.path.dirname("./result/")) 49 | except OSError as exc: # Guard against race condition 50 | if exc.errno != errno.EEXIST: 51 | raise 52 | 53 | ofile = open("result/i_check" + "_" + str(i)+"_" + name_data, 'a') 54 | report = "\n---------- " + str(datetime.datetime.now()) + " " + " ----------\n" 55 | f_name = "updateStream_0_0_ii{}.csv".format(i) 56 | params_file = open(os.path.join(param_path, f_name), "r") 57 | #header = next(params_file) 58 | params_list=[] 59 | count = 0 60 | for number, line in enumerate(params_file): 61 | p = line.strip().split('|') 62 | count += 1 63 | params_list.append(p) 64 | 65 | total_time = 0.0 66 | n = 0 67 | jwt = get_jwt() 68 | for j in range(len(params_list)): 69 | params = params_list[j] 70 | if i == 1: 71 | query = i_check_1(params) 72 | time = check(jwt, query) 73 | elif i == 2: 74 | query = i_check_2(params) 75 | time = check(jwt, query) 76 | elif i == 3: 77 | query = i_check_3(params) 78 | time = check(jwt, query) 79 | elif i == 4: 80 | query = i_check_4(params) 81 | time = check(jwt, query) 82 | elif i == 5: 83 | query = i_check_5(params) 84 | time = check(jwt, query) 85 | elif i == 6: 86 | query = i_check_6(params) 87 | time = check(jwt, query) 88 | elif i == 7: 89 | query = i_check_7(params) 90 | time = check(jwt, query) 91 | elif i == 8: 92 | query = i_check_8(params) 93 | time = check(jwt, query) 94 | exe_time = time 95 | if j != 0: 96 | total_time += exe_time 97 | #param = '|'.join(params) 98 | line = str(n)+": " +name_data + ", " + "i_check_"+str(i)+", " + params[0] + ", " + str(exe_time) + " seconds" 99 | print(line) 100 | report += line + "\n" 101 | if n == 100: 102 | break; 103 | n += 1 104 | report += "summary, " + "i_check_"+str(i) + ", " + str(total_time/n) + " seconds\n" 105 | ofile.write(report) 106 | ofile.write("\n") 107 | print (report) 108 | 109 | 110 | if __name__ == "__main__": 111 | if len(sys.argv) < 4: 112 | print("Usage: python run_ch.py data_name param_path query_index") 113 | sys.exit() 114 | run_i_check(os.path.basename(sys.argv[1]), sys.argv[2], int(sys.argv[3]) if len(sys.argv) == 4 else "") 115 | -------------------------------------------------------------------------------- /light/run_id.py: -------------------------------------------------------------------------------- 1 | import random 2 | import sys 3 | import os 4 | import datetime 5 | import pycurl, json 6 | from timeit import default_timer as timer 7 | 8 | from lgraph_query_runner import * 9 | 10 | format = 'Content-Type:application/json;charset=utf-8' 11 | login_url = "http://localhost:7071/login" 12 | login_usr = json.dumps({"user": "admin", "password":"admin123456"}) 13 | login_head = [format] 14 | 15 | query_url = "http://127.0.0.1:7071/cypher" 16 | 17 | def get_jwt(): 18 | c = pycurl.Curl() 19 | c.setopt(pycurl.URL, login_url) 20 | c.setopt(pycurl.POST, 1) 21 | c.setopt(pycurl.HTTPHEADER, login_head) 22 | c.setopt(pycurl.POSTFIELDS, login_usr) 23 | result = c.perform_rb() 24 | result = json.loads(result) 25 | jwt = result["jwt"] 26 | return jwt 27 | 28 | def delete(jwt, query): 29 | auth = 'Authorization:Bearer '+jwt 30 | head = [format,auth] 31 | c = pycurl.Curl() 32 | c.setopt(pycurl.URL, query_url) 33 | c.setopt(pycurl.POST, 1) 34 | c.setopt(pycurl.HTTPHEADER, head) 35 | data = json.dumps({"graph":"default", "script":query}) 36 | c.setopt(pycurl.POSTFIELDS, data) 37 | result = c.perform_rb() 38 | c.close() 39 | result = json.loads(result) 40 | print(result) 41 | time = result["elapsed"] 42 | return float(time) 43 | 44 | def run_i_delete(name_data, param_path,i): 45 | #create result folder 46 | if not os.path.exists(os.path.dirname("./result/")): 47 | try: 48 | os.makedirs(os.path.dirname("./result/")) 49 | except OSError as exc: # Guard against race condition 50 | if exc.errno != errno.EEXIST: 51 | raise 52 | 53 | ofile = open("result/i_delete" + "_" + str(i)+"_" + name_data, 'a') 54 | report = "\n---------- " + str(datetime.datetime.now()) + " " + " ----------\n" 55 | f_name = "updateStream_0_0_ii{}.csv".format(i) 56 | params_file = open(os.path.join(param_path, f_name), "r") 57 | #header = next(params_file) 58 | params_list=[] 59 | count = 0 60 | for number, line in enumerate(params_file): 61 | p = line.strip().split('|') 62 | count += 1 63 | params_list.append(p) 64 | 65 | total_time = 0.0 66 | n = 0 67 | jwt = get_jwt() 68 | for j in range(len(params_list)): 69 | params = params_list[j] 70 | if i == 1: 71 | query = i_delete_1(params) 72 | time = delete(jwt, query) 73 | elif i == 2: 74 | query = i_delete_2(params) 75 | time = delete(jwt, query) 76 | elif i == 3: 77 | query = i_delete_3(params) 78 | time = delete(jwt, query) 79 | elif i == 4: 80 | query = i_delete_4(params) 81 | time = delete(jwt, query) 82 | elif i == 5: 83 | query = i_delete_5(params) 84 | time = delete(jwt, query) 85 | elif i == 6: 86 | query = i_delete_6(params) 87 | time = delete(jwt, query) 88 | elif i == 7: 89 | query = i_delete_7(params) 90 | time = delete(jwt, query) 91 | elif i == 8: 92 | query = i_delete_8(params) 93 | time = delete(jwt, query) 94 | exe_time = time 95 | if j != 0: 96 | total_time += exe_time 97 | #param = '|'.join(params) 98 | line = str(n)+": " +name_data + ", " + "i_delete_"+str(i)+", " + params[0] + ", " + str(exe_time) + " seconds" 99 | print(line) 100 | report += line + "\n" 101 | if n == 100: 102 | break; 103 | n += 1 104 | report += "summary, " + "i_delete_"+str(i) + ", " + str(total_time/n) + " seconds\n" 105 | ofile.write(report) 106 | ofile.write("\n") 107 | print (report) 108 | 109 | 110 | if __name__ == "__main__": 111 | if len(sys.argv) < 4: 112 | print("Usage: python run_id.py data_name param_path query_index") 113 | sys.exit() 114 | run_i_delete(os.path.basename(sys.argv[1]), sys.argv[2], int(sys.argv[3]) if len(sys.argv) == 4 else "") 115 | -------------------------------------------------------------------------------- /tiger/load_scripts/time.py: -------------------------------------------------------------------------------- 1 | ############################################################ 2 | # Copyright (c) 2015-now, TigerGraph Inc. 3 | # All rights reserved 4 | # It is provided as it is for benchmark reproducible purpose. 5 | # anyone can use it for benchmark purpose with the 6 | # acknowledgement to TigerGraph. 7 | ############################################################ 8 | 9 | ############################################################ 10 | # The orginal script is provided by TigerGraph. 11 | # We add and modify some code 12 | # to adapt this benchmark to our experiment. 13 | # The modified part is noted with 'By rwang:......' 14 | ############################################################ 15 | 16 | import sys 17 | import os 18 | import re 19 | from datetime import datetime, timedelta 20 | import argparse 21 | 22 | def getTimeLoadingJob(file): 23 | with open(file, "r") as f: 24 | end_time_str = "" 25 | for line in reversed(list(f)): 26 | if "System_GCleanUp|Finished" in line: 27 | end_time_str = line[:15] 28 | break 29 | elif "*** Aborted at" in line: 30 | end_epoch_str = line[15:25] 31 | break 32 | if not end_time_str and not end_epoch_str: 33 | return -1 34 | begin_time_str = re.match(r".+\.([0-9]+).log", file, re.M).group(1) 35 | begin_time = datetime.fromtimestamp(int(begin_time_str)/1000.0) 36 | if end_time_str: 37 | end_time_str = "{}-{:02d}-{:02d} {}".format(begin_time.year, begin_time.month, begin_time.day, end_time_str) 38 | end_time = datetime.strptime(end_time_str, "%Y-%m-%d %H:%M:%S.%f") 39 | else: 40 | end_time = datetime.fromtimestamp(int(end_epoch_str)) 41 | if end_time < begin_time: 42 | end_time = end_time + timedelta(days=1) 43 | return round((end_time - begin_time).total_seconds(), 3) 44 | 45 | def getTimeBuildGstore(file): 46 | with open(file, "r") as f: 47 | end_time_str = "" 48 | num_line_to_read = 10 49 | for line in reversed(list(f)): 50 | num_line_to_read -= 1 51 | if "All done!" in line: 52 | end_time_str = re.match(r".+\(([0-9\.]+) ms\).+", line).group(1) 53 | break 54 | if num_line_to_read <= 0: 55 | break 56 | if not end_time_str: 57 | return -1 58 | else: 59 | return round(float(end_time_str)/1000, 3) 60 | 61 | if __name__ == "__main__": 62 | ap = argparse.ArgumentParser() 63 | ap.add_argument("loading_job", help="Full path to the loding job log file") 64 | ap.add_argument("-d", "--delta", nargs="?", help="Full path to the gstore build log file, delta.out") 65 | 66 | args = ap.parse_args() 67 | loading_job_time = getTimeLoadingJob(args.loading_job) 68 | if loading_job_time > 0: 69 | print("- Loading job: {} s".format(loading_job_time)) 70 | else: 71 | print("Loading job is still in progress. Please come back later.") 72 | 73 | try: 74 | home_dir = os.environ['HOME'] 75 | link = home_dir + "/.gium" 76 | tg_home = os.path.abspath(os.path.join(os.readlink(link), os.pardir)) 77 | 78 | if "-d" not in sys.argv: 79 | sys.exit() 80 | 81 | if args.delta == None: 82 | delta_path = tg_home + "/logs/delta.out" 83 | if not os.path.isfile(delta_path): 84 | print ("Failed to anto-detect \"delta.out\", Please specify the full path to /logs/delta.out") 85 | sys.exit() 86 | else: 87 | building_gstore_time = getTimeBuildGstore(delta_path) 88 | else: 89 | building_gstore_time = getTimeBuildGstore(args.delta) 90 | 91 | if building_gstore_time > 0: 92 | print("- Building gstore: {} s".format(building_gstore_time)) 93 | print("- Total: {} s".format(loading_job_time + building_gstore_time)) 94 | else: 95 | print("Build gstore is still in progress. Please come back later.") 96 | 97 | except SystemExit: 98 | pass 99 | except NotADirectoryError: 100 | print("Can't find TigerGraph. Please make sure that you can run TigerGraph with the current user.") 101 | except FileNotFoundError: 102 | print("No such file: " + args.delta) 103 | except: 104 | print("Something went wrong.") 105 | -------------------------------------------------------------------------------- /light/README.md: -------------------------------------------------------------------------------- 1 | # LightGraph Installation & Evaluation Guide 2 | 3 | ## For IU & IS queries 4 | 5 | Note: LightGraph is not free. You must apply for a trial license from the [official website](https://fma-ai.cn/). The trial version of LightGraph only can be installed and used via **docker**. The following guide is only for **IU & IS** queries, the guide for IC & BI queries is presented later in this doc. 6 | 7 | 8 | 9 | ### Installation 10 | 11 | Environment: 12 | 13 | ​ OS: Ubuntu 16.04 LTS 14 | 15 | ​ Java version: 1.8.0_242 16 | 17 | Get the docker image of LightGraph: 18 | 19 | ``` 20 | docker pull fmacloud/lgraph:latest 21 | ``` 22 | 23 | ​ or 24 | 25 | ``` 26 | wget https://fma-ai.cn/download/lgraph_latest.tar 27 | docker load -i lgraph_latest.tar 28 | ``` 29 | 30 | Start docker, -v is the mapping directory, {host_data_dir} is the directory where you want to save the data, -p is used for port mapping, {container_id} is the container id of Docker, which can be obtained through **docker ps**: 31 | 32 | ``` 33 | docker run -d -v {host_data_dir}:/mnt -p 7090:7090 -it fmacloud/lgraph:latest 34 | docker exec -it {container_id} bash 35 | ``` 36 | 37 | I usually enter docker container to do experiments. As the queries are executed vis REST API, you should install *curl* in docker container: 38 | 39 | ``` 40 | apt-get update 41 | apt-get install curl 42 | ``` 43 | 44 | 45 | 46 | ### Load Data & Start Server 47 | 48 | Copy raw data to docker container and enter docker container: 49 | 50 | ``` 51 | docker cp /path/to/DG1/ {container_id}:/root/light/data/ 52 | docker exec -it {container_id} bash 53 | ``` 54 | 55 | Preprocess and Set path to raw data directory, loaded graph directory and license directory: 56 | 57 | ``` 58 | cd load_scripts 59 | . ./path.sh 60 | ./convert_data.sh 61 | cp data_import.conf $LIGHT_DATA_DIR 62 | cd $LIGHT_DATA_DIR 63 | ``` 64 | 65 | Load data: 66 | 67 | ``` 68 | lgraph_import -c $LIGHT_DATA_DIR/data_import.conf --dir $LGRAPH_DB_DIR --overwrite 1 --online false 69 | ``` 70 | 71 | Record LightGraph loaded data size: 72 | 73 | ``` 74 | du -sh $LGRAPH_DB_DIR 75 | ``` 76 | 77 | Start LightGraph server: 78 | 79 | ``` 80 | cd ./light/load_scripts 81 | lgraph_server -c lgraph_server.json --license $LIC_DIR --directory $LGRAPH_DB_DIR -d start 82 | ``` 83 | 84 | 85 | 86 | Create Index 87 | 88 | LightGraph automatically create index for ID attributes. Thus, for IU&IS, you do not need to create other indexes. But if want to create indexes, you could following: 89 | 90 | ``` 91 | Login to get ${jwt}: curl -XPOST -H "Content-Type: application/json" -s "http://127.0.0.1:7071/login" -d'{"user":"admin","password":"admin123456"}' 92 | 93 | Replace ${jwt} and create index: curl -XPOST -H "Authorization:Bearer ${jwt}" -H "Content-Type: application/json" "http://127.0.0.1:7071/db/default/index" -d'{"label": "Person", "field": "firstName", "is_unique" : false}' 94 | ``` 95 | 96 | 97 | 98 | ### Run benchmark 99 | 100 | Create a new folder to store results: 101 | 102 | ``` 103 | mkdir result 104 | ``` 105 | 106 | Run micro queries IU & IS: 107 | 108 | As the parameters of IS queries are associated with the parameters of IU queries, you should firstly run IU queries, then run IS queries: 109 | 110 | ``` 111 | run IU: ./run_ii.sh DG1 ./../seeds/seeds_1/ 112 | run IS: ./run_is.sh DG1 ./../seeds/seeds_1/ 113 | ``` 114 | 115 | CH queries can check inserted results. IU queries will destroy the original structure of datasets, delete inserted vertexes and edges by ID queries: 116 | 117 | ``` 118 | run CH: ./run_ch.sh DG1 ./../seeds/seeds_1/ 119 | run ID: ./run_id.sh DG1 ./../seeds/seeds_1/ 120 | ``` 121 | 122 | Note : As the inserted data must not contained in the original dataset, we adopt different parameters for micro queries in different scale datasets, such as seeds_1 for DG1, seeds_10 for DG10 and seeds_100 for DG100. 123 | 124 | Optionally, run all micro queries in one step: 125 | 126 | ``` 127 | run all micro queries: ./run_micro_all.sh DG1 ./../seeds/seeds_1/ 128 | ``` 129 | 130 | 131 | 132 | ## For IC & BI queries 133 | 134 | The related docker image and operation guide is provide by the [LightGraph staff](https://fma-ai.cn/). It is a temp version, not public. The formal version will be released soon. -------------------------------------------------------------------------------- /neo4j/run_is.py: -------------------------------------------------------------------------------- 1 | import random 2 | import sys 3 | import os 4 | import datetime 5 | from timeit import default_timer as timer 6 | 7 | from query_runner_new import * 8 | 9 | def run_i_short(name_data, param_path,i): 10 | #create result folder 11 | if not os.path.exists(os.path.dirname("./result/")): 12 | try: 13 | os.makedirs(os.path.dirname("./result/")) 14 | except OSError as exc: # Guard against race condition 15 | if exc.errno != errno.EEXIST: 16 | raise 17 | 18 | runner = Neo4jQueryRunner(); 19 | 20 | ofile = open("result/i_short" + "_" + str(i) +"_" + name_data, 'a') 21 | report = "\n---------- " + str(datetime.datetime.now()) + " " + " ----------\n" 22 | ''' 23 | # generate is parameters 24 | file_names = [] 25 | if i == 1: 26 | file_names.append("updateStream_0_0_ii1.csv") 27 | elif i == 2 or i == 4 or i == 5: 28 | file_names.append("updateStream_0_0_ii6.csv") 29 | file_names.append("updateStream_0_0_ii7.csv") 30 | elif i == 3: 31 | file_names.append("updateStream_0_0_ii8.csv") 32 | elif i == 6 or i==7: 33 | file_names.append("updateStream_0_0_ii7.csv") 34 | 35 | params_list=[] 36 | for f_name in file_names: 37 | params_file = open(os.path.join(param_path, f_name), "r") 38 | #header = next(params_file) 39 | for number, line in enumerate(params_file): 40 | p = line.strip().split('|') 41 | if i == 1 or i == 3 or i==4 or i==5: 42 | params_list.append(p[0]) 43 | elif i == 2: 44 | if f_name == "updateStream_0_0_ii6.csv": 45 | params_list.append(p[8]) 46 | elif f_name == "updateStream_0_0_ii7.csv": 47 | params_list.append(p[6]) 48 | elif i == 6 or i ==7: 49 | if p[8] != "-1": 50 | params_list.append(p[8]) 51 | else: 52 | params_list.append(p[9]) 53 | random.shuffle(params_list) 54 | params_list = params_list[:101] 55 | ''' 56 | f_name = "interactive_0_0_is{}.csv".format(i) 57 | params_file = open(os.path.join(param_path, f_name), "r") 58 | params_list=[] 59 | for number, line in enumerate(params_file): 60 | p = line.strip() 61 | params_list.append(p) 62 | 63 | total_time = 0.0 64 | n = 0 65 | for j in range(len(params_list)): 66 | params = params_list[j] 67 | if i == 1: 68 | start = timer() 69 | runner.i_short_1(params) 70 | end = timer() 71 | elif i == 2: 72 | start = timer() 73 | runner.i_short_2(params) 74 | end = timer() 75 | elif i == 3: 76 | start = timer() 77 | runner.i_short_3(params) 78 | end = timer() 79 | elif i == 4: 80 | start = timer() 81 | runner.i_short_4(params) 82 | end = timer() 83 | elif i == 5: 84 | start = timer() 85 | runner.i_short_5(params) 86 | end = timer() 87 | elif i == 6: 88 | start = timer() 89 | runner.i_short_6(params) 90 | end = timer() 91 | elif i == 7: 92 | start = timer() 93 | runner.i_short_7(params) 94 | end = timer() 95 | elif i == 8: 96 | start = timer() 97 | runner.i_short_8(params) 98 | end = timer() 99 | exe_time = end - start 100 | if j != 0: 101 | total_time += exe_time 102 | 103 | line = str(n)+": " +name_data + ", " + "i_short_"+str(i)+", " + params + ", " + str(exe_time) + " seconds" 104 | print(line) 105 | report += line + "\n" 106 | if n == 100: 107 | break; 108 | n += 1 109 | report += "summary, " + "i_short_"+str(i)+ ", " + str(total_time/n) + " seconds\n" 110 | ofile.write(report) 111 | ofile.write("\n") 112 | print (report) 113 | 114 | 115 | if __name__ == "__main__": 116 | if len(sys.argv) < 4: 117 | print("Usage: python run_is.py data_name param_path query_index") 118 | sys.exit() 119 | run_i_short(os.path.basename(sys.argv[1]), sys.argv[2], int(sys.argv[3]) if len(sys.argv) == 4 else "") 120 | --------------------------------------------------------------------------------