diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-1.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-1.gsql new file mode 100644 index 000000000..16bb8a75a --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-1.gsql @@ -0,0 +1,42 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 1 query description is on page 89 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi1(DATETIME date) SYNTAX v3{ + + TYPEDEF TUPLE RESULT; + + HeapAccum(0, year DESC, isComment ASC, lengthCategory ASC) @@result; + GroupByAccum messageCount, SumAccum sumMessageLength> @@midResult; + + OrAccum @isComment; + SumAccum @lengthCategory; + + UINT total; + INT epoch = datetime_to_epoch(date) * 1000; + messages = SELECT m FROM (m:Comment:Post) WHERE m.creationDate < epoch; + total = messages.size(); + messages = + SELECT m FROM (m:messages) + WHERE m.length > 0 + ACCUM + m.@isComment = (m.type == "Comment"), + IF m.length < 40 THEN + m.@lengthCategory = 0 + ELSE IF m.length < 80 THEN + m.@lengthCategory = 1 + ELSE IF m.length < 160 THEN + m.@lengthCategory = 2 + ELSE + m.@lengthCategory = 3 + END + POST-ACCUM (m) @@midResult += (year(epoch_to_datetime(m.creationDate/1000)), m.@isComment, m.@lengthCategory -> 1, m.length); + + @@result.resize(@@midResult.size()); + FOREACH m IN @@midResult DO + @@result += RESULT(m.year, m.isComment, m.lengthCategory, m.messageCount, + (m.sumMessageLength * 1.0 / m.messageCount), m.sumMessageLength, (m.messageCount * 1.0 / total)); + END; + + PRINT @@result as result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-10.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-10.gsql new file mode 100644 index 000000000..f73cab901 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-10.gsql @@ -0,0 +1,52 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 10 query description is on page 98 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi10(VERTEX personId, STRING country, STRING tagClass) SYNTAX v3 { + TYPEDEF TUPLE RESULT; + OrAccum @visited, @selected; + SetAccum> @tags; + MapAccum, SumAccum> @messageCount; + HeapAccum (100, messageCount DESC, tagName ASC, personId ASC) @@result; + + candidates = SELECT p FROM (cn:Country {name:country}) <-[:IS_PART_OF]-()<-[:IS_LOCATED_IN]- (p:Person); + + S = {personId}; + UINT pathLength = 0; + S = SELECT s FROM (s:S) ACCUM s.@visited = TRUE; + WHILE pathLength < 3 DO + S = + SELECT t + FROM (s:S) -[:KNOWS]- (t:Person) + WHERE NOT t.@visited + POST-ACCUM (t) t.@visited = TRUE; + pathLength += 1; + END; + # Here, S is the Person with shortest length of 3 + persons = SELECT t + FROM (s:S) -[:KNOWS]- (t:Person) + WHERE NOT t.@visited; + persons = (persons UNION S) INTERSECT candidates; + + messages = SELECT m + FROM (p:persons) <-[:HAS_CREATOR]- (m:Comment:Post) + ACCUM m.@selected += TRUE; + + messages = SELECT m + FROM (tc:TagClass {name:tagClass}) <-[:HAS_TYPE]- (t:Tag) <-[:HAS_TAG]- (m:Comment:Post) + WHERE m.@selected; + + messages = SELECT m + FROM (m:messages) -[:HAS_TAG]-> (t:Tag) + ACCUM m.@tags += t; + + persons = SELECT p + FROM (m:messages) -[:HAS_CREATOR]-> (p:Person) + ACCUM + FOREACH t IN m.@tags DO + p.@messageCount += (t -> 1) + END + POST-ACCUM (p) + FOREACH (t,cnt) IN p.@messageCount DO + @@result += RESULT(p.id, t.name, cnt) + END; + PRINT @@result as result; +} \ No newline at end of file diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-11.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-11.gsql new file mode 100644 index 000000000..5bc6db54c --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-11.gsql @@ -0,0 +1,29 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 11 query description is on page 99 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi11(STRING country, DATETIME startDate, DATETIME endDate) SYNTAX v3 { + SumAccum @@result; + OrAccum @selected; + SetAccum> @oneHopNeighbor; + + persons = SELECT p FROM (cn:Country {name:country}) <-[:IS_PART_OF]-()<-[:IS_LOCATED_IN]- (p:Person) + ACCUM p.@selected += True; + + INT startEpoch = datetime_to_epoch(startDate) * 1000; + INT endEpoch = datetime_to_epoch(endDate) * 1000; + + P2 = SELECT p2 + FROM (p1:persons) -[e:KNOWS]- (p2:Person) + WHERE p2.@selected AND (e.creationDate BETWEEN startEpoch AND endEpoch) AND p1.id < p2.id + ACCUM p2.@oneHopNeighbor += p1; + + P3 = SELECT p3 + FROM (p2:P2) -[e:KNOWS]- (p3:Person) + WHERE p3.@selected AND (e.creationDate BETWEEN startEpoch AND endEpoch) AND p2.id < p3.id + ACCUM FOREACH p1 IN p2.@oneHopNeighbor DO + IF p1 IN p3.@oneHopNeighbor THEN + @@result += 1 + END + END; + + PRINT @@result as result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-12.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-12.gsql new file mode 100644 index 000000000..d8b594dc7 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-12.gsql @@ -0,0 +1,38 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 12 query description is on page 100 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi12(DATETIME startDate, INT lengthThreshold, SET languages) SYNTAX v3 { + + TYPEDEF TUPLE RESULT; + MapAccum @@personCount; + HeapAccum(0, personCount DESC, messageCount DESC) @@result; + SumAccum @messageCount; + INT diff; + INT startEpoch = datetime_to_epoch(startDate) * 1000; + + posts = SELECT p FROM (p:Post) WHERE p.language IN languages; + M = SELECT m FROM (p:posts)<-[:ROOT_POST]- (m:Comment:Post); + M = M UNION posts; + M = SELECT m FROM (m:M) + WHERE m.length > 0 + AND m.length < lengthThreshold + AND m.creationDate > startEpoch; + + persons = + SELECT p + FROM (:M) -[:HAS_CREATOR]-> (p:Person) + ACCUM p.@messageCount += 1 + POST-ACCUM (p) @@personCount += (p.@messageCount -> 1); + + allPersons = {Person.*}; + diff = allPersons.size() - persons.size(); + IF diff > 0 THEN + @@personCount += (0 -> diff); + END; + + @@result.resize(@@personCount.size()); + FOREACH (messageCount, personCount) IN @@personCount DO + @@result += RESULT(messageCount, personCount); + END; + + PRINT @@result as result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-13.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-13.gsql new file mode 100644 index 000000000..1d2069dc4 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-13.gsql @@ -0,0 +1,53 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 13 query description is on page 101 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi13(STRING country, DATETIME endDate) SYNTAX v3 { + + TYPEDEF TUPLE RESULT; + HeapAccum(100, zombieScore DESC, zombieId ASC) @@result; + OrAccum @selected; + SumAccum @messageCount; + SumAccum @totalLikeCount; + SumAccum @zombieLikeCount; + INT endEpoch = datetime_to_epoch(endDate) * 1000; + + zombieCandidates = + SELECT p FROM (cn:Country {name:country}) <-[:IS_PART_OF]-()<-[:IS_LOCATED_IN]- (p:Person) + WHERE p.creationDate < endEpoch; + + tmp = + SELECT p + FROM (p:zombieCandidates) <-[:HAS_CREATOR]- (m:Comment:Post) + WHERE m.creationDate < endEpoch + ACCUM p.@messageCount += 1; + + zombies = + SELECT p + FROM (p:zombieCandidates) + WHERE p.@messageCount < (year(endDate) - year(epoch_to_datetime(p.creationDate/1000))) * 12 + + (month(endDate) - month(epoch_to_datetime(p.creationDate/1000))) + 1 + ACCUM p.@selected += true; + + M = SELECT m FROM (z:zombies) <-[:HAS_CREATOR]- (m:Comment:Post); + + tmp = SELECT p FROM (m:M) <-[:LIKES]- (p:Person) + WHERE p.creationDate < endEpoch + ACCUM + m.@totalLikeCount += 1, + IF p.@selected THEN + m.@zombieLikeCount += 1 + END; + + tmp = SELECT m FROM (m:M) -[:HAS_CREATOR]-> (p:Person) + ACCUM p.@totalLikeCount += m.@totalLikeCount, p.@zombieLikeCount += m.@zombieLikeCount; + + zombies = + SELECT z FROM (z:zombies) + POST-ACCUM (z) + IF z.@totalLikeCount > 0 THEN + @@result += RESULT(z.id, z.@zombieLikeCount, z.@totalLikeCount, 1.0 * z.@zombieLikeCount / z.@totalLikeCount) + ELSE + @@result += RESULT(z.id, 0, 0, 0.0) + END; + + PRINT @@result as result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-14.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-14.gsql new file mode 100644 index 000000000..99f59cb50 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-14.gsql @@ -0,0 +1,82 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 14 query description is on page 102 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi14(STRING country1, STRING country2) SYNTAX v3 { + TYPEDEF TUPLE pairScore; + TYPEDEF TUPLE ps; + + HeapAccum(1, score DESC, pid ASC) @pScore; + MapAccum, UINT> @score; + MinAccum> @person2; + SetAccum> @knows, @p2s1, @p2s2, @p2s3, @p2s4; + OrAccum @valid, @selected; + HeapAccum(1, score DESC, person1Id ASC, person2Id ASC) @cityresults; + HeapAccum(100, score DESC, person1Id ASC, person2Id ASC) @@result; + MinAccum @min_pid2; + + P1candidate = SELECT p + FROM (cn:Country {name:country1}) <-[:IS_PART_OF]-()<-[:IS_LOCATED_IN]-(p:Person); + + P2candidate = + SELECT p2 + FROM (cn:Country {name:country2}) <-[:IS_PART_OF]-()<-[:IS_LOCATED_IN]-(p2:Person) + ACCUM p2.@selected += true; + + P2 = + SELECT p2 FROM (p1:P1candidate) -[:KNOWS]- (p2:Person) + WHERE p2.@selected + ACCUM p1.@valid += True, + p1.@knows += p2, + p1.@min_pid2 += p2.id; + + P1 = SELECT p FROM (p:Person) WHERE p.@valid; + # Case 1 + tmp = SELECT p1 FROM (p1:P1) -[e:REPLY_COUNT]-> (p2:Person) + WHERE p2.@selected AND e.cnt > 0 + ACCUM p1.@score += (p2 -> 4); + + # Case 2 + tmp = SELECT p1 FROM (p1:P1) <-[e:REPLY_COUNT]- (p2:Person) + WHERE p2.@selected AND e.cnt > 0 + ACCUM p1.@score += (p2 -> 1); + + # Case 3 + M2 = SELECT m2 FROM (p:P2) <-[:HAS_CREATOR]- (m2) + ACCUM m2.@p2s3 += p; + tmp = SELECT p1 FROM (m2:M2) <-[:LIKES]- (p1:Person) + WHERE p1.@valid + ACCUM p1.@p2s3 += m2.@p2s3 + POST-ACCUM (p1) p1.@p2s3 = (p1.@p2s3 INTERSECT p1.@knows); + + # Case 4 + M2 = SELECT m2 FROM (p2:P2) -[:LIKES]-> (m2) + ACCUM m2.@p2s4 += p2; + tmp = SELECT p1 FROM (m2:M2) -[:HAS_CREATOR]-> (p1:Person) + WHERE p1.@valid + ACCUM p1.@p2s4 += m2.@p2s4 + POST-ACCUM (p1) p1.@p2s4 = (p1.@p2s4 INTERSECT p1.@knows); + + P1 = SELECT p1 FROM (p1:P1) + ACCUM + FOREACH p2 IN p1.@p2s3 DO + p1.@score += (p2 -> 10) + END, + FOREACH p2 IN p1.@p2s4 DO + p1.@score += (p2 -> 1) + END + POST-ACCUM (p1) + FOREACH (p2,score) IN p1.@score DO + p1.@pScore += ps(p2.id,score) + END; + + City1 = SELECT c1 FROM (p1:P1) -[:IS_LOCATED_IN]-> (c1:City) + ACCUM + IF p1.@pScore.size() > 0 THEN + c1.@cityresults += pairScore(p1.id, p1.@pScore.top().pid, c1.name, p1.@pScore.top().score) + ELSE + c1.@cityresults += pairScore(p1.id, p1.@min_pid2, c1.name, 0) + END; + + City1 = SELECT c1 FROM (c1:City1) + ACCUM @@result += c1.@cityresults.top(); + PRINT @@result as result; +} \ No newline at end of file diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-15.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-15.gsql new file mode 100644 index 000000000..adfc0c471 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-15.gsql @@ -0,0 +1,51 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 15 query description is on page 103 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi15(VERTEX person1Id, VERTEX person2Id, DATETIME startDate, DATETIME endDate) syntax v3 { + MinAccum @@result, @dis; + OrAccum @next; + SetAccum> @creator; + MapAccum, SumAccum> @replyCount; + OrAccum @visited; + INT startEpoch = datetime_to_epoch(startDate) * 1000; + INT endEpoch = datetime_to_epoch(endDate) * 1000; + + F = SELECT f FROM (f:Forum) WHERE f.creationDate BETWEEN startEpoch AND endEpoch; + P = SELECT p FROM (:F) -[:CONTAINER_OF]-> (p:Post); + M = SELECT m FROM (:P) <-[:ROOT_POST]- (m:Comment) ACCUM m.@visited += true; + M = M UNION P; + tmp = SELECT p FROM (m:M) -[:HAS_CREATOR]-> (p:Person) ACCUM m.@creator += p; + M1 = SELECT m1 FROM (m1:M) <-[:REPLY_OF]- (m2:Comment) + WHERE m2.@visited + ACCUM + UINT w = 1, + IF m1.type == "Post" THEN w = 2 END, + FOREACH p1 IN m1.@creator DO + FOREACH p2 IN m2.@creator DO + p1.@replyCount += (p2 -> w) + END + END; + P = {Person.*}; + @@result = P.size(); + S = {person1Id}; + S = SELECT s FROM (s:S) ACCUM s.@dis = 0; + WHILE S.size()>0 DO + S = SELECT t FROM (s:S)-[e:KNOWS]-(t:Person) + ACCUM + DOUBLE t_dis = s.@dis + 2.0/(2 + s.@replyCount.get(t) + t.@replyCount.get(s)), + IF t_dis < @@result AND t_dis < t.@dis THEN + t.@dis += t_dis, + t.@next += true, + IF t == person2Id THEN + @@result += t_dis + END + END + HAVING t.@next; + S = SELECT s FROM (s:S) ACCUM s.@next = false; + END; + + IF ABS(@@result - P.size()) < 1 THEN + PRINT -1 as result; + ELSE + PRINT @@result as result; + END; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-16.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-16.gsql new file mode 100644 index 000000000..1fd238163 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-16.gsql @@ -0,0 +1,54 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 16 query description is on page 104 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi16(STRING tagA, DATETIME dateA, + STRING tagB, DATETIME dateB, UINT maxKnowsLimit) SYNTAX v3 { + + TYPEDEF TUPLE RESULT; + HeapAccum(20, totalMessageCount DESC, personId ASC) @@result; + + SumAccum @knowsCountA, @messageCountA; + SumAccum @knowsCountB, @messageCountB; + INT yearA, monthA, dayA; + INT yearB, monthB, dayB; + yearA = year(dateA); monthA = month(dateA); dayA = day(dateA); + yearB = year(dateB); monthB = month(dateB); dayB = day(dateB); + + personsA = + SELECT p + FROM (t:Tag {name:tagA}) <-[:HAS_TAG]- (m:Comment:Post) -[:HAS_CREATOR]-> (p:Person) + WHERE + year(epoch_to_datetime(m.creationDate/1000)) == yearA AND + month(epoch_to_datetime(m.creationDate/1000)) == monthA AND + day(epoch_to_datetime(m.creationDate/1000)) == dayA + ACCUM p.@messageCountA += 1; + + tmp = SELECT p + FROM (:personsA) -[:KNOWS]- (p:personsA) + ACCUM p.@knowsCountA += 1; + + # need to include person without any friends + personsA = SELECT p FROM (p:personsA) WHERE p.@knowsCountA <= maxKnowsLimit; + + personsB = + SELECT p + FROM (t:Tag {name:tagB}) <-[:HAS_TAG]- (m:Comment:Post) -[:HAS_CREATOR]-> (p:Person) + WHERE + year(epoch_to_datetime(m.creationDate/1000)) == yearB AND + month(epoch_to_datetime(m.creationDate/1000)) == monthB AND + day(epoch_to_datetime(m.creationDate/1000)) == dayB + ACCUM p.@messageCountB += 1; + + tmp = SELECT p FROM (:personsB) -[:KNOWS]- (p:personsB) + ACCUM p.@knowsCountB += 1; + + # need to include person without any friends + personsB = SELECT p FROM (p:personsB) WHERE p.@knowsCountB <= maxKnowsLimit; + + persons = personsA INTERSECT personsB; + persons = + SELECT p + FROM (p:persons) + POST-ACCUM (p) @@result += RESULT(p.id, p.@messageCountA, p.@messageCountB, p.@messageCountA+p.@messageCountB); + + PRINT @@result as result; +} \ No newline at end of file diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-17.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-17.gsql new file mode 100644 index 000000000..d2dc9513b --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-17.gsql @@ -0,0 +1,84 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 17 query description is on page 105 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi17(STRING tag, INT delta) SYNTAX v3 { + TYPEDEF TUPLE RESULT; + HeapAccum(10, messageCount DESC, person1Id ASC) @@result; + OrAccum @hasTag, @isCreator; + # There is only one forum and creator for a message. + MinAccum> @forum; + MinAccum> @creator; + # On the other hand, creator and forum have many messages + SetAccum @messages; + # forum1 Id -> (person1 Id -> smallest message1 creationdate) + MapAccum, MapAccum, MinAccum>> @@Forum2Creator; + # comment id -> creator forum id + SetAccum> @CreatorForums, @Forum1; + # MapAccum, SetAccum>> @@hasMember; + SetAccum> @hasMember; + # person1 id in message2 + SetAccum @person1Id; + MapAccum> @@messageCount; + UINT deltaInMs = delta * 60 * 60 * 1000; + + messagesWithTag = + SELECT m + FROM (t:Tag {name:tag}) <-[:HAS_TAG]- (m:Comment:Post) ACCUM m.@hasTag = true; + + creators = + SELECT p + FROM (m:messagesWithTag) -[:HAS_CREATOR] -> (p:Person) + ACCUM m.@creator = p, p.@isCreator = True; + + forum12 = + SELECT f + FROM (m:messagesWithTag) -[:ROOT_POST*0..1]->()<-[:CONTAINER_OF]- (f:Forum) + PER(m,f) + ACCUM + m.@forum = f, f.@messages += m, + @@Forum2Creator += (f -> (m.@creator-> m.creationDate)); + + forum12 = + SELECT f FROM (f:forum12) -[:HAS_MEMBER]-> (p:Person) + ACCUM FOREACH m in f.@messages DO + m.@hasMember += p + END; + + messages2 = + SELECT m + FROM (f:forum12) -[:HAS_MEMBER]-> (p:Person) <-[:HAS_CREATOR]- (m:Comment:Post) + WHERE p.@isCreator AND m.@hasTag + ACCUM m.@CreatorForums += f; + + messages2 = + SELECT m2 + FROM (m:messages2) -[:REPLY_OF]-> (m2) + WHERE m2.@hasTag AND m.@creator != m2.@creator + ACCUM m2.@Forum1 += (m2.@CreatorForums INTERSECT m.@CreatorForums) + POST-ACCUM (m2) m2.@Forum1.remove(m2.@forum) + HAVING m2.@Forum1.size() > 0; + + message2 = + SELECT m2 FROM (m2:messages2) + ACCUM + FOREACH f IN m2.@Forum1 DO + FOREACH (p1,m1date) IN @@Forum2Creator.get(f) DO + IF m1date + deltaInMs < m2.creationDate + AND (NOT m2.@hasMember.contains(p1)) THEN + m2.@person1Id += p1.id + END + END + END + HAVING m2.@person1Id.size() > 0; + + message2 = + SELECT m2 FROM (m2:messages2) + ACCUM FOREACH c IN m2.@person1Id DO + @@messageCount += (c -> 1) + END; + + FOREACH (personId,num) IN @@messageCount DO + @@result += RESULT(personId,num); + END; + + PRINT @@result as result; +} \ No newline at end of file diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-18.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-18.gsql new file mode 100644 index 000000000..b019893c3 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-18.gsql @@ -0,0 +1,32 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 18 query description is on page 106 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi18(STRING tag) SYNTAX v3 { + TYPEDEF TUPLE RESULT; + HeapAccum(20, mutualFriendCount DESC, person1Id ASC, person2Id ASC) @@result; + SetAccum @exclude; + MapAccum, SumAccum> @mutualFriendCount; + OrAccum @hasInterest; + + person1 = + SELECT p + FROM (t:Tag {name:tag}) <-[:HAS_INTEREST]- (p:Person) + ACCUM p.@hasInterest += TRUE, p.@exclude += p; + + tmp = + SELECT p2 + FROM (p1:person1) -[:KNOWS]- (p2:Person) + WHERE p2.@hasInterest + ACCUM p2.@exclude += p1; + + person2 = + SELECT p2 + FROM (p1:person1) -[:KNOWS]- (:Person) -[:KNOWS]- (p2:Person) + WHERE p2.@hasInterest AND NOT p2.@exclude.contains(p1) + ACCUM p2.@mutualFriendCount += (p1 -> 1) + POST-ACCUM (p2) + FOREACH (p,num) IN p2.@mutualFriendCount DO + @@result += RESULT(p.id, p2.id, num) + END; + + PRINT @@result as result; +} \ No newline at end of file diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-19.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-19.gsql new file mode 100644 index 000000000..f3312974b --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-19.gsql @@ -0,0 +1,52 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 19 query description is on page 107 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi19(VERTEX city1Id, VERTEX city2Id) syntax v3 { + TYPEDEF TUPLE RESULT; + TYPEDEF TUPLE PAIR; + HeapAccum(1, person1Id ASC, person2Id ASC) @@result; + MapAccum> @@pairs; + SetAccum @@shortest; + MapAccum> @dist1; + SumAccum @creatorId; + OrAccum @next, @isTarget; + MinAccum @@threshold; + P = {Person.*}; + @@threshold += P.size() * 40; + + city1 = {city1Id}; + city2 = {city2Id}; + S = SELECT p FROM (c:city1) <-[:IS_LOCATED_IN]- (p:Person) ACCUM p.@dist1 += (p.id->0); + S2 = SELECT p FROM (c:city2) <-[:IS_LOCATED_IN]- (p:Person) ACCUM p.@isTarget += True; + + WHILE S.size()>0 DO + # Expand the know map, we also neglect the distances larger than threshold + S = SELECT t FROM (s:S)-[e:KNOWS]-(t:Person) + WHERE e.weight19 > 0 + ACCUM + FOREACH (p,dis) IN s.@dist1 DO + INT weight = round (40 - sqrt(e.weight19)), + IF weight <= 1 THEN weight = 1 END, + UINT t_dis = dis + weight, + IF t_dis <= @@threshold AND t_dis < t.@dist1.get(p) THEN + t.@dist1 += (p -> t_dis), + t.@next += true, + IF t.@isTarget THEN + @@threshold += t_dis, + @@pairs += (t_dis -> PAIR(p, t.id)) + END + END + END + HAVING t.@next; + S = SELECT s FROM (s:S) ACCUM s.@next = false; + + @@shortest.clear(); + @@shortest += @@pairs.get(@@threshold); + @@pairs.clear(); + @@pairs += (@@threshold -> @@shortest); + END; + @@result.resize(@@shortest.size()); + FOREACH pp IN @@shortest DO + @@result += RESULT(pp.person1Id, pp.person2Id, @@threshold); + END; + PRINT @@result as result; +} \ No newline at end of file diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-2.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-2.gsql new file mode 100644 index 000000000..8561d5b47 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-2.gsql @@ -0,0 +1,36 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 2 query description is on page 90 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi2(DATETIME date, STRING tagClass) SYNTAX v3 { + + TYPEDEF TUPLE RESULT; + HeapAccum(100, diff DESC, tagName ASC) @@result; + SumAccum @countWindow1; + SumAccum @countWindow2; + INT dateEpoch = datetime_to_epoch(date) * 1000; + INT dateEnd1 = datetime_to_epoch(datetime_add(date, INTERVAL 100 DAY)) * 1000; + INT dateEnd2 = datetime_to_epoch(datetime_add(date, INTERVAL 200 DAY)) * 1000; + + tagsUnderTagClass = SELECT t + FROM (tc:TagClass{name:tagClass}) <-[:HAS_TYPE]- (t:Tag); + + tmp = + SELECT m + FROM (t:tagsUnderTagClass) <-[:HAS_TAG]- (m:Comment:Post) + WHERE dateEpoch <= m.creationDate AND m.creationDate < dateEnd2 + ACCUM + IF m.creationDate < dateEnd1 THEN + t.@countWindow1 += 1 + ELSE + t.@countWindow2 += 1 + END + POST-ACCUM (t) + @@result += RESULT(t.name, t.@countWindow1, t.@countWindow2, abs(t.@countWindow1 - t.@countWindow2)); + + tmp = + SELECT t + FROM (t:tagsUnderTagClass) + WHERE t.@countWindow1 == 0 AND t.@countWindow2 == 0 + ACCUM @@result += RESULT(t.name, 0,0,0); + + PRINT @@result as result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-20.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-20.gsql new file mode 100644 index 000000000..bc2c284db --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-20.gsql @@ -0,0 +1,44 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 20 query description is on page 108 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi20(STRING company, VERTEX person2Id) syntax v3 { + TYPEDEF TUPLE RESULT; + HeapAccum(20, totalWeight ASC, person1Id ASC) @@result; + OrAccum @visited, @next, @inCompany; + MinAccum @dist; + MapAccum> @@paths; + SetAccum @@shortest; + MinAccum @@threshold; + @@threshold = 40; + S1 = + SELECT p + FROM (c:Company {name:company}) <-[:WORK_AT]- (p:Person) + WHERE p != person2Id + ACCUM p.@inCompany += true; + + S = {person2Id}; + S = Select s FROM (s:S) ACCUM s.@visited += true, s.@dist += 0; + WHILE S.size()>0 DO + S = SELECT t FROM (s:S)-[e:KNOWS]-(t:Person) + WHERE e.weight20 < 10000 + ACCUM + UINT t_dis = s.@dist + e.weight20, + IF t_dis < t.@dist AND t_dis <= @@threshold THEN + t.@dist += t_dis, + t.@next += true + END + HAVING t.@next; + S = SELECT s FROM (s:S) + ACCUM s.@next = false, + IF s.@inCompany THEN @@paths += (s.@dist -> s.id), @@threshold += s.@dist END; + # Update the threshold + + @@shortest.clear(); + @@shortest += @@paths.get(@@threshold); + @@paths.clear(); + @@paths += (@@threshold -> @@shortest); + END; # WHILE + FOREACH p IN @@shortest DO + @@result += RESULT(p, @@threshold); + END; + PRINT @@result as result; +} \ No newline at end of file diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-3.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-3.gsql new file mode 100644 index 000000000..ea965784d --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-3.gsql @@ -0,0 +1,33 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 3 query description is on page 91 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi3(STRING tagClass, STRING country) SYNTAX v3 { + TYPEDEF TUPLE RESULT; + HeapAccum(20, messageCount DESC, forumId ASC) @@result; + SumAccum @messageCount; + MinAccum @personId; + OrAccum @selected; + forums = + SELECT f + FROM (cn:Country{name:country}) <-[:IS_PART_OF]-() <-[:IS_LOCATED_IN]- (p:Person) <-[:HAS_MODERATOR]- (f:Forum) + ACCUM f.@personId = p.id, f.@selected += true; + messages = + SELECT m + FROM (t:TagClass{name:tagClass}) <-[:HAS_TYPE]-()<-[:HAS_TAG]- (m:Comment:Post); + posts1 = + SELECT p + FROM (m:messages) -[:ROOT_POST]-> (p:Post) + ACCUM p.@messageCount += 1; + posts2 = + SELECT p FROM (p:messages) + WHERE p.type == "Post" + ACCUM p.@messageCount += 1; + posts = posts1 UNION posts2; + tmp = + SELECT f + FROM (p:posts) <-[:CONTAINER_OF]- (f:Forum) + WHERE f.@selected + ACCUM f.@messageCount += p.@messageCount + POST-ACCUM (f) @@result += RESULT(f.id, f.title, ms_to_string(f.creationDate), f.@personId, f.@messageCount); + + PRINT @@result as result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-4.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-4.gsql new file mode 100644 index 000000000..abb860d09 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-4.gsql @@ -0,0 +1,34 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 4 query description is on page 92 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi4 (DATETIME date) SYNTAX v3 { + TYPEDEF TUPLE RESULT; + HeapAccum(100, messageCount DESC, personId ASC) @@result; + OrAccum @inForum, @selected; + SumAccum @messageCount; + INT epoch = datetime_to_epoch(date) * 1000; + + popularForums = SELECT f FROM (f:Forum) + WHERE f.creationDate > epoch + ORDER BY f.maxMember DESC, f.id ASC + LIMIT 100; + + P = SELECT p FROM (:popularForums) -[:HAS_MEMBER]-> (p:Person) ACCUM p.@inForum += true; + + posts = SELECT p FROM (:popularForums) -[:CONTAINER_OF]-> (p:Post); + + comments = SELECT m FROM (:posts) <- [:ROOT_POST] -(m:Comment); + + M = posts UNION comments; + + tmp = SELECT p FROM (:M)- [:HAS_CREATOR] -> (p:Person) + WHERE p.@inForum + ACCUM p.@messageCount += 1 + ORDER BY p.@messageCount DESC, p.id ASC + LIMIT 100; + + tmp = SELECT p FROM (p:P) + ACCUM @@result += RESULT(p.id, p.firstName, p.lastName, ms_to_string(p.creationDate), p.@messageCount); + + PRINT @@result as result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-5.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-5.gsql new file mode 100644 index 000000000..1f8c6c4ac --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-5.gsql @@ -0,0 +1,28 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 5 query description is on page 93 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi5(STRING tag) SYNTAX v3 { + + TYPEDEF TUPLE RESULT; + + HeapAccum(100, score DESC, personId ASC) @@result; + + SumAccum @likeCount; + SumAccum @messageCount; + SumAccum @replyCount; + + messages = SELECT m FROM (t:Tag {name:tag}) <-[:HAS_TAG]-(m:Comment:Post); + tmp = SELECT m FROM (m:messages) <-[:LIKES]- (p:Person) ACCUM m.@likeCount += 1; + tmp = SELECT m FROM (m:messages) <-[:REPLY_OF]- (c:Comment) ACCUM m.@replyCount += 1; + tmp = + SELECT p + FROM (m:messages) -[:HAS_CREATOR]-> (p:Person) + ACCUM + p.@replyCount += m.@replyCount, + p.@likeCount += m.@likeCount, + p.@messageCount += 1 + POST-ACCUM (p) + @@result += RESULT(p.id, p.@replyCount, p.@likeCount, p.@messageCount, + p.@messageCount + 2*p.@replyCount + 10*p.@likeCount); + + PRINT @@result as result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-6.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-6.gsql new file mode 100644 index 000000000..dbed11a09 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-6.gsql @@ -0,0 +1,22 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 6 query description is on page 94 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi6(STRING tag) SYNTAX v3 { + TYPEDEF TUPLE RESULT; + HeapAccum(100, authorityScore DESC, personId ASC) @@result; + SumAccum @authorityScore; + MapAccum, MinAccum> @pScore; + + message1 = SELECT m FROM (t:Tag {name:tag}) <-[:HAS_TAG]- (m:Comment:Post); + + tmp = SELECT m FROM (m:message1)<- [:LIKES]- (p2:Person) + ACCUM m.@pScore += (p2->p2.popularityScore); + + person1 = SELECT p1 FROM (m:message1) -[:HAS_CREATOR]-> (p1:Person) + ACCUM p1.@pScore += m.@pScore + POST-ACCUM (p1) + FOREACH (p,score) IN p1.@pScore DO + p1.@authorityScore += score + END, + @@result += RESULT(p1.id, p1.@authorityScore), p1.@pScore.clear(); + PRINT @@result as result; +} \ No newline at end of file diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-7.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-7.gsql new file mode 100644 index 000000000..fdade6d07 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-7.gsql @@ -0,0 +1,24 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 7 query description is on page 95 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi7(STRING tag) SYNTAX v3 { + + # count is a reserved keyword. + TYPEDEF TUPLE RESULT; + + HeapAccum(100, replyCount DESC, relatedTagName ASC) @@result; + + SumAccum @count; + + tagWithName = SELECT t FROM (t:Tag {name:tag}); + replies = SELECT c FROM (:tagWithName) <-[:HAS_TAG]-()<-[:REPLY_OF]- (c:Comment); + repliesWithTag = SELECT r FROM (:tagWithName) <-[:HAS_TAG]- (r:replies); + repliesWithoutTag = replies MINUS repliesWithTag; + + tmp = + SELECT t + FROM (r:repliesWithoutTag) -[:HAS_TAG]-> (t:Tag) + ACCUM t.@count += 1 + POST-ACCUM (t) @@result += RESULT(t.name, t.@count); + + PRINT @@result as result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-8.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-8.gsql new file mode 100644 index 000000000..e3c1f0178 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-8.gsql @@ -0,0 +1,32 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 8 query description is on page 96 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi8(STRING tag, DATETIME startDate, DATETIME endDate) SYNTAX v3 { + TYPEDEF TUPLE RESULT; + HeapAccum(100, totalScore DESC, personId ASC) @@result; + SumAccum @score; + SumAccum @friendsScore; + INT startEpoch = datetime_to_epoch(startDate) * 1000; + INT endEpoch = datetime_to_epoch(endDate) * 1000; + + tagWithName = SELECT t FROM (t:Tag {name:tag}); + + personsWithInterest = + SELECT p FROM (:tagWithName) <-[:HAS_INTEREST]- (p:Person) + ACCUM p.@score += 100; + + personsWithMessages = + SELECT p + FROM (:tagWithName) <-[:HAS_TAG]- (m:Comment:Post) -[:HAS_CREATOR]-> (p:Person) + WHERE m.creationDate BETWEEN startEpoch AND endEpoch + ACCUM p.@score += 1; + + personsWithScore = personsWithInterest UNION personsWithMessages; + + tmp = SELECT p FROM (p:personsWithScore) -[:KNOWS]- (f:Person) + ACCUM p.@friendsScore += f.@score; + + personsWithScore = SELECT p FROM (p:personsWithScore) + ACCUM @@result += RESULT(p.id, p.@score, p.@friendsScore, p.@score + p.@friendsScore); + + PRINT @@result as result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-9.gsql b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-9.gsql new file mode 100644 index 000000000..4b60d06d3 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/business_intelligence/syntax_v3/bi-9.gsql @@ -0,0 +1,26 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//BI 9 query description is on page 97 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE DISTRIBUTED QUERY bi9(DATETIME startDate, DATETIME endDate) SYNTAX v3 { + TYPEDEF TUPLE RESULT; + HeapAccum(100, messageCount DESC, personId ASC) @@result; + SumAccum @messageCount; + SumAccum @threadCount; + + INT startEpoch = datetime_to_epoch(startDate) * 1000; + INT endEpoch = datetime_to_epoch(endDate) * 1000; + + threads = SELECT s FROM (s:Post) WHERE s.creationDate BETWEEN startEpoch AND endEpoch; + + tmp = SELECT s FROM (s:threads) <-[:ROOT_POST]- (t:Comment) + WHERE t.creationDate BETWEEN startEpoch AND endEpoch + ACCUM s.@messageCount += 1; + + persons = SELECT p FROM (t:threads) -[:HAS_CREATOR]-> (p:Person) + ACCUM + p.@threadCount += 1, + p.@messageCount += t.@messageCount + 1 + POST-ACCUM (p) + @@result += RESULT(p.id, p.firstName, p.lastName, p.@threadCount, p.@messageCount); + + PRINT @@result as result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic10_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic10_v3.gsql new file mode 100644 index 000000000..085087834 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic10_v3.gsql @@ -0,0 +1,52 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IC 10 query description is on page 67 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY ic10_v3(vertex personId, int month) syntax v3{ + TYPEDEF TUPLE friendInfo; + HeapAccum(10, commonInterestScore DESC, personId ASC) @@result; + SumAccum @commonInterestScore; + SumAccum @city; + OrAccum @visited, @hasInterest; + int nextMonth; + + nextMonth = 1 + month % 12; + + S = { personId }; + F = + SELECT p FROM (s:S) -[:KNOWS]- (p:Person) + ACCUM s.@visited += true, p.@visited += true; + F2 = + SELECT p + FROM (f:F) -[:KNOWS]- (p:Person) -[:IS_LOCATED_IN]-> (c:City) + WHERE p.@visited == false + AND ((day(p.birthday) >= 21 AND month(p.birthday) == month) OR + (day(p.birthday) < 22 AND month(p.birthday) == nextMonth)) + PER(p,c) + ACCUM p.@city = c.name; + + tmp = + SELECT t + FROM (s:S)-[:HAS_INTEREST]-> (t:Tag) + ACCUM t.@hasInterest += true; + + tmp = + SELECT p + FROM (f:F2) <-[:HAS_CREATOR]- (p:Post) -[:HAS_TAG]->(t:Tag) + WHERE t.@hasInterest + PER(p) + ACCUM p.@hasInterest += true; + + tmp = + SELECT f + FROM (f:F2) <-[:HAS_CREATOR]- (p:Post) + ACCUM + IF p.@hasInterest == true THEN + f.@commonInterestScore += 1 + ELSE + f.@commonInterestScore += (-1) + END; + + F2 = + SELECT v FROM (v:F2) + ACCUM @@result += friendInfo(v.id, v.firstName, v.lastName, v.@commonInterestScore, v.gender, v.@city); + PRINT @@result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic11_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic11_v3.gsql new file mode 100644 index 000000000..819bb1e80 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic11_v3.gsql @@ -0,0 +1,20 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IC 11 query description is on page 68 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY ic11_v3(vertex personId, string country, int workFromYear) syntax v3{ + TYPEDEF TUPLE friendInfo; + HeapAccum(10, organizationWorkFromYear ASC, personId ASC, organizationName DESC) @@result; + OrAccum @selected; + + C = {Country.*}; + S = { personId }; + companies = SELECT org FROM (c:Country) <-[:IS_LOCATED_IN]-(org:Company) + WHERE c.name == country + ACCUM org.@selected += TRUE; + + P = + SELECT p + FROM (s:S) -[:KNOWS*1..2]- (p:Person) -[e:WORK_AT] -> (c:Company) + WHERE p != personId AND c.@selected AND e.workFrom < workFromYear + ACCUM @@result += friendInfo(p.id, p.firstName, p.lastName, c.name, e.workFrom); + PRINT @@result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic12_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic12_v3.gsql new file mode 100644 index 000000000..5aecb568a --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic12_v3.gsql @@ -0,0 +1,26 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IC 12 query description is on page 69 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY ic12_v3(vertex personId, string tagClass) syntax v3{ + SetAccum> @replySet; + SetAccum @tagNames; + SumAccum @replyCount; + S = { personId }; + + P = + SELECT p + FROM (s:S) -[:KNOWS]- (p:Person) <-[:HAS_CREATOR]- (c:Comment) + -[:REPLY_OF]-> (:Post) -[:HAS_TAG]-> (t:Tag) + -[:HAS_TYPE]-> (:TagClass) -[:IS_SUBCLASS_OF*0..]-> (tc:TagClass {name:tagClass}) + PER(p,c,t) + ACCUM p.@replySet += c, p.@tagNames += t.name + POST-ACCUM (p) p.@replyCount = p.@replySet.size(), p.@replySet.clear() + ORDER BY p.@replyCount DESC, p.id ASC + LIMIT 20; + + PRINT P[ + P.id AS personId, + P.firstName AS personFirstName, + P.lastName AS personLastName, + P.@tagNames AS tagNames, + P.@replyCount AS replyCount]; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic13_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic13_v3.gsql new file mode 100644 index 000000000..a50fd7636 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic13_v3.gsql @@ -0,0 +1,53 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IC 13 query description is on page 70 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY ic13_v3(VERTEX person1Id, VERTEX person2Id) syntax v3{ + SumAccum @dist1 = -1, @dist2 = -1; + OrAccum @@found, @@next1=True, @@next2=True; + MaxAccum @@result=-1; + + IF person1Id != person2Id THEN + S1 = { person1Id }; + S2 = { person2Id }; + S1 = SELECT s FROM (s:S1) ACCUM s.@dist1 = 0; + S2 = SELECT s FROM (s:S2) ACCUM s.@dist2 = 0; + + WHILE (NOT @@found) AND (@@next1 OR @@next2) DO + IF NOT @@found AND @@next1 THEN + @@next1 = False; + S1 = + SELECT t + FROM (s:S1)-[:KNOWS]-(t:Person) + WHERE t.@dist1 < 0 + ACCUM + IF t.@dist2 > -1 THEN + @@found += True, + @@result += s.@dist1 + t.@dist2 + 1 + ELSE + @@next1 += True, + t.@dist1 = s.@dist1 + 1 + END; + END; + + IF NOT @@found AND @@next2 THEN + @@next2 = False; + S2 = + SELECT t + FROM (s:S2)-[:KNOWS]-(t:Person) + WHERE t.@dist2 < 0 + ACCUM + IF t.@dist1 > -1 THEN + @@found += True, + @@result += s.@dist2 + t.@dist1 + 1 + ELSE + @@next2 += True, + t.@dist2 = s.@dist2 + 1 + END; + END; + END; + + ELSE //IF person1Id != person2Id THEN + @@result += 0; + END; + + PRINT @@result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic14_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic14_v3.gsql new file mode 100644 index 000000000..56e0a6465 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic14_v3.gsql @@ -0,0 +1,108 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IC 14 query description is on page 71 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY ic14_v3(VERTEX person1Id, VERTEX person2Id) syntax v3{ + TYPEDEF tuple pathInfo; + + OrAccum @visited1, @visited2; + OrAccum @@found, @@next1=true, @@next2=true; + ListAccum>> @path; + ListAccum>> @@pathAll; + SumAccum @@weight = 0.0; + HeapAccum(0, pathWeight DESC) @@result; + STRING jsonStr; + SetAccum> @@p1, @@p2; + IF person1Id != person2Id THEN + vPerson = { person1Id, person2Id }; + S1 = { person1Id }; + S2 = { person2Id }; + S1 = SELECT s FROM (s:S1) ACCUM s.@visited1 += true, s.@path += [s]; + S2 = SELECT s FROM (s:S2) ACCUM s.@visited2 += true, s.@path += [s]; + + WHILE NOT @@found AND (@@next1 OR @@next2) DO + IF NOT @@found AND @@next1 THEN + @@next1 = false; + S1 = + SELECT t + FROM (s:S1)-[:KNOWS]-(t:Person) + WHERE NOT t.@visited1 + ACCUM + IF t.@visited2 THEN + @@found += True, + FOREACH p1 IN s.@path DO + FOREACH p2 IN t.@path DO + @@pathAll += p1 + p2 + END + END + ELSE + @@next1 += true, + t.@visited1 += true, + FOREACH p IN s.@path DO + t.@path += p + [t] + END + END; + END; + + IF NOT @@found AND @@next2 THEN + @@next2 = false; + S2 = + SELECT t + FROM (s:S2)-[:KNOWS]-(t:Person) + WHERE NOT t.@visited2 + ACCUM + IF t.@visited1 THEN + @@found += True, + FOREACH p1 IN s.@path DO + FOREACH p2 IN t.@path DO + @@pathAll += p2 + p1 + END + END + ELSE + @@next2 += true, + t.@visited2 += true, + FOREACH p IN s.@path DO + t.@path += [t] + p + END + END; + END; + END; //WHILE NOT @@found AND @@next DO + END; //IF person1Id != person2Id THEN + @@result.resize(@@pathAll.size()); + FOREACH path IN @@pathAll DO + jsonStr = "["; + @@weight = 0.0; + FOREACH i IN range[0, path.size()-2] DO + jsonStr = jsonStr + to_string(path.get(i).id) + ","; + @@p1.clear(); @@p1 += path.get(i); + @@p2.clear(); @@p2 += path.get(i+1); + S1 = @@p1; + S2 = @@p2; + P1 = SELECT c FROM (s:S1) <-[:HAS_CREATOR]- (c:Post); + P2 = SELECT c FROM (s:S2) <-[:HAS_CREATOR]- (c:Post); + C1 = SELECT c FROM (s:S1) <-[:HAS_CREATOR]- (c:Comment); + C2 = SELECT c FROM (s:S2) <-[:HAS_CREATOR]- (c:Comment); + + c1p = + SELECT c1 + FROM (:P2) <-[:REPLY_OF]- (c1:C1) + ACCUM @@weight += 1; + + c1c = + SELECT c1 + FROM (:C2) <-[:REPLY_OF]- (c1:C1) + ACCUM @@weight += 0.5; + + c2p = + SELECT c2 + FROM (:P1) <-[:REPLY_OF]- (c2:C2) + ACCUM @@weight += 1; + + c2c = + SELECT c2 + FROM (:C1) <-[:REPLY_OF]- (c2:C2) + ACCUM @@weight += 0.5; + END; //FOREACH i IN range[0, path.size()-2] DO + jsonStr = jsonStr + to_string(path.get(path.size()-1).id) + "]"; + @@result += pathInfo(parse_json_array(jsonStr), @@weight); + END; //FOREACH path IN @@pathAll DO + PRINT @@result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic1_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic1_v3.gsql new file mode 100644 index 000000000..3bd1ac770 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic1_v3.gsql @@ -0,0 +1,68 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IC 1 query description is on page 58 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY ic1_v3(vertex personId, string firstName) syntax v3{ + typedef tuple org; + SumAccum @distance; + SumAccum @friendCityName; + MapAccum @personInfo; + MapAccum> @@compInfo, @@univInfo; + SetAccum @comp, @univ; + + S = { personId }; + + P1 = SELECT p + FROM (s:S) -[:KNOWS]- (p:Person) + WHERE p != personId AND p.firstName == firstName + ACCUM p.@distance = 1; + + P2 = + SELECT p + FROM (:P1) -[:KNOWS]- (p:Person) + WHERE p != personId AND p.firstName == firstName AND p.@distance == 0 + ACCUM p.@distance = 2; + + P3 = + SELECT p + FROM (:P2) -[:KNOWS]- (p:Person) + WHERE p != personId AND p.firstName == firstName AND p.@distance == 0 + ACCUM p.@distance = 3; + + P = P1 UNION P2 UNION P3; + tmp = + SELECT ct + FROM (p:P) -[:IS_LOCATED_IN]-> (ct:City) + ACCUM p.@friendCityName = ct.name; + + tmp = + SELECT cn + FROM (p:P) -[ew:WORK_AT]-> (co:Company) -[:IS_LOCATED_IN]-> (cn:Country) + PER MATCH + ACCUM p.@comp += org(co.name, ew.workFrom, cn.name); + + tmp = + SELECT ct + FROM (p:P) -[es:STUDY_AT]->(u:University) -[:IS_LOCATED_IN]-> (ct:City) + PER MATCH + ACCUM p.@univ += org(u.name, es.classYear, ct.name); + + P = + SELECT p + FROM (p:P) + ORDER BY p.@distance ASC, p.lastName ASC, p.id ASC + LIMIT 20; + + print P[ + P.id AS friendId, + P.lastName AS friendLastName, + P.@distance AS distanceFromPerson, + P.birthday AS friendBirthday, + P.creationDate AS friendCreationDate, + P.gender AS friendGender, + P.browserUsed AS friendBrowserUsed, + P.locationIP AS friendLocationIp, + P.email AS friendEmails, + P.speaks AS friendSpeaks, + P.@friendCityName AS friendCityName, + P.@univ AS friendUniversities, + P.@comp AS friendCompanies]; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic2_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic2_v3.gsql new file mode 100644 index 000000000..5e128f8d3 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic2_v3.gsql @@ -0,0 +1,19 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IC 2 query description is on page 59 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY ic2_v3(VERTEX personId, DATETIME date) syntax v3{ + TYPEDEF TUPLE msg; + HeapAccum(20, messageCreationDate DESC, messageId ASC) @@result; + S = { personId }; + T = + SELECT t + FROM (s:S) -[:KNOWS] -(p:Person) <- [:HAS_CREATOR] - (t:Comment:Post) + WHERE t.creationDate < date + PER(p,t) + ACCUM + IF t.type == "Comment" OR t.content != "" THEN + @@result += msg(p.id, p.firstName, p.lastName, t.id, t.content, t.creationDate) + ELSE + @@result += msg(p.id, p.firstName, p.lastName, t.id, t.imageFile, t.creationDate) + END; + PRINT @@result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic3_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic3_v3.gsql new file mode 100644 index 000000000..f3d88baba --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic3_v3.gsql @@ -0,0 +1,47 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IC 3 query description is on page 60 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY ic3_v3(VERTEX personId, STRING country1, STRING country2, DATETIME startDate, INT duration) syntax v3{ + TYPEDEF TUPLE msgStats; + HeapAccum(20, xCount DESC, personId ASC) @@result; + SumAccum @xCount, @yCount; + OrAccum @selected, @selected2; + datetime endDate; + endDate = datetime_add(startDate, INTERVAL duration DAY); + + S = { personId }; + P = SELECT p + FROM (s:S) -[:KNOWS*1..2]- (p:Person) + WHERE p != personId; + + PersonCity = SELECT c + FROM (cn:Country) <-[:IS_PART_OF]- (c:City) + WHERE cn.name != country1 AND cn.name != country2 + ACCUM c.@selected += true; + + P = SELECT p FROM (p:P) -[:IS_LOCATED_IN]-> (c:City) + WHERE c.@selected; + + M = SELECT m + FROM (p:P) <-[:HAS_CREATOR]- (m:Post:Comment) + WHERE m.creationDate >= startDate AND m.creationDate < endDate; + + Messages = SELECT m + FROM (m:M) -[:IS_LOCATED_IN]-> (cn:Country) + WHERE (cn.name == country1 OR cn.name == country2) + ACCUM + m.@selected += (cn.name == country1), + m.@selected2 += (cn.name == country2) + HAVING m.@selected OR m.@selected2; + + P = SELECT p + FROM (m:M)-[:HAS_CREATOR]->(p:Person) + ACCUM + IF m.@selected THEN p.@xCount += 1 END, + IF m.@selected2 THEN p.@yCount += 1 END + HAVING p.@xCount > 0 AND p.@yCount > 0; + + P = SELECT p + FROM (p:P) + ACCUM @@result += msgStats(p.id, p.firstName, p.lastName, p.@xCount, p.@yCount, (p.@xCount + p.@yCount)); + PRINT @@result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic4_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic4_v3.gsql new file mode 100644 index 000000000..08ef6a12d --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic4_v3.gsql @@ -0,0 +1,36 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IC 4 query description is on page 61 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY ic4_v3(VERTEX personId, DATETIME startDate, INT duration) syntax v3{ + TYPEDEF TUPLE topic; + SumAccum @postCount; + SetAccum> @@tagsFav, @@tagsExc; + HeapAccum(10, postCount DESC, tagName ASC) @@result; + + DATETIME endDate; + endDate = DATETIME_add(startDate, INTERVAL duration DAY); + + S = { personId }; + // find tags of posts created by the Person's friends in the given timeframe + vTag = + SELECT t + FROM (s:S) -[:KNOWS] - (:Person) <- [:HAS_CREATOR] - (m:Post) - [:HAS_TAG] -> (t:Tag) + WHERE m.creationDate < endDate + PER(m,t) + ACCUM + CASE + WHEN m.creationDate >= startDate THEN + t.@postCount += 1 + WHEN m.creationDate < startDate THEN + @@tagsExc += t + END + POST-ACCUM (t) CASE WHEN t.@postCount > 0 THEN @@tagsFav += t END; + + @@tagsFav = @@tagsFav MINUS @@tagsExc; + vTag = { @@tagsFav }; + + // perform ordering on vTag + vTag = + SELECT t FROM (t:vTag) + ACCUM @@result += topic(t.name, t.@postCount); + PRINT @@result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic5_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic5_v3.gsql new file mode 100644 index 000000000..21f7a38f2 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic5_v3.gsql @@ -0,0 +1,26 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IC 5 query description is on page 62 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY ic5_v3(VERTEX personId, DATETIME startDate) syntax v3{ + TYPEDEF TUPLE forumInfo; + HeapAccum(20, postCount DESC, id ASC) @@result; + SetAccum> @@friendAll; + SetAccum @memberIds; + SumAccum @postCount; + + S = { personId }; + vForum = + SELECT t + FROM (s:S)-[:KNOWS*1..2]-(p:Person)<-[e:HAS_MEMBER]-(t:Forum) + WHERE p != s AND e.joinDate > startDate + PER(p,t) + ACCUM t.@memberIds += p.id, @@friendAll += p; + + vFriend = { @@friendAll }; + vForum = + SELECT t + FROM (s:vFriend)<-[:HAS_CREATOR]-(:Post)<-[:CONTAINER_OF]-(t:vForum) + ACCUM CASE WHEN s.id IN t.@memberIds THEN t.@postCount += 1 END + POST-ACCUM (t) @@result += forumInfo(t.title, t.@postCount, t.id); + + PRINT @@result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic6_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic6_v3.gsql new file mode 100644 index 000000000..b77352ed0 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic6_v3.gsql @@ -0,0 +1,21 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IC 6 query description is on page 63 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY ic6_v3(VERTEX personId, STRING tag) syntax v3{ + TYPEDEF tuple tagStats; + HeapAccum(10, postCount DESC, tag ASC) @@result; + SumAccum @postCount; + S = { personId }; + vPost = + SELECT m + FROM (s:S) -[:KNOWS*1..2]-(p:Person) <-[:HAS_CREATOR]-(m:Post) -[:HAS_TAG]->(t:Tag {name:tag}) + WHERE s != p; + + vTag = + SELECT t + FROM (:vPost)-[:HAS_TAG]->(t:Tag) + WHERE t.name != tag + ACCUM t.@postCount += 1 + POST-ACCUM (t) @@result += tagStats(t.name, t.@postCount); + + PRINT @@result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic7_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic7_v3.gsql new file mode 100644 index 000000000..b7070be79 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic7_v3.gsql @@ -0,0 +1,27 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IC 7 query description is on page 64 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY ic7_v3(VERTEX personId) syntax v3{ + TYPEDEF tuple liker; + HeapAccum(20, likeCreationDate DESC, commentOrPostId ASC) @@result; + AndAccum @isNew; + S = { personId }; + P = + SELECT p + FROM (:S)-[:KNOWS]-(p:Person) + ACCUM p.@isNew += FALSE; + + P = + SELECT p + FROM (s:S)<-[:HAS_CREATOR]- (m:Comment:Post) <-[e:LIKES]-(p:Person) + PER(m,e,p) + ACCUM + IF m.type == "Comment" OR m.content != "" THEN + @@result += liker(p.id, p.firstName, p.lastName, e.creationDate, m.id, + m.content, datetime_diff(e.creationDate, m.creationDate) / 60, p.@isNew) + ELSE + @@result += liker(p.id, p.firstName, p.lastName, e.creationDate, m.id, + m.imageFile, datetime_diff(e.creationDate, m.creationDate) / 60, p.@isNew) + END; + PRINT @@result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic8_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic8_v3.gsql new file mode 100644 index 000000000..d0b82ebbd --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic8_v3.gsql @@ -0,0 +1,16 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IC 8 query description is on page 65 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY ic8_v3(VERTEX personId) syntax v3{ + TYPEDEF tuple replier; + HeapAccum(20, commentCreationDate DESC, commentId ASC) @@result; + + S = { personId }; + M = + SELECT m + FROM (s:S) <-[:HAS_CREATOR]- (:Comment:Post) <-[:REPLY_OF]- (m:Comment) -[:HAS_CREATOR]-> (p:Person) + PER(m,p) + ACCUM @@result += replier(p.id, p.firstName, p.lastName, m.creationDate, m.id, m.content); + + PRINT @@result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic9_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic9_v3.gsql new file mode 100644 index 000000000..b138afbdc --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_complex/syntax_v3/ic9_v3.gsql @@ -0,0 +1,29 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IC 9 query description is on page 66 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY ic9_v3(VERTEX personId, DATETIME date) syntax v3{ + TYPEDEF tuple msgInfo; + + HeapAccum(20, messageCreationDate DESC, messageId ASC) @@result; + SumAccum @personId; + SumAccum @personFirstName, @personLastName; + + S = { personId }; + M = + SELECT s + FROM (s:S) -[:KNOWS*1..2]- (p:Person) <-[:HAS_CREATOR]- (m:Comment:Post) + WHERE s != p AND m.creationDate < date + PER(s,p,m) + ACCUM + m.@personId = p.id, + m.@personFirstName = p.firstName, + m.@personLastName = p.lastName + POST-ACCUM (m) + IF m.type == "Comment" OR m.content != "" THEN + @@result += msgInfo(m.@personId, m.@personFirstName, m.@personLastName, m.id, m.content, m.creationDate) + ELSE + @@result += msgInfo(m.@personId, m.@personFirstName, m.@personLastName, m.id, m.imageFile, m.creationDate) + END; + + PRINT @@result; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is1_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is1_v3.gsql new file mode 100644 index 000000000..38ebada58 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is1_v3.gsql @@ -0,0 +1,22 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IS 1 query description is on page 72 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY is1_v3(VERTEX personId) syntax v3{ + SumAccum @cityId; + + P = { personId }; + P = + SELECT s + FROM (s:P)-[:IS_LOCATED_IN]->(t:City) + ACCUM s.@cityId = t.id; + + PRINT P[ + P.firstName AS firstName, + P.lastName AS lastName, + P.birthday AS birthday, + P.locationIP AS locationIP, + P.browserUsed AS browserUsed, + P.@cityId AS cityId, + P.gender AS gender, + P.creationDate AS creationDate + ]; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is2_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is2_v3.gsql new file mode 100644 index 000000000..135ec97b3 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is2_v3.gsql @@ -0,0 +1,36 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IS 2 query description is on page 73 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY is2_v3(VERTEX personId) syntax v3{ + TYPEDEF TUPLE ogPostInfo; + + SumAccum @postId, @authorOgId; + SumAccum @messageContent, @authorOgFN, @authorOgLN; + HeapAccum(10, messageCreationDate DESC, messageId DESC) @@result; + + vPerson = { personId }; + vMessage = + SELECT t + FROM (s:vPerson)<-[:HAS_CREATOR]-(t:Comment:Post) + ORDER BY t.creationDate DESC, t.id DESC + LIMIT 10; + + accMessage = + SELECT s + FROM (s:vMessage) -[:REPLY_OF*0..]->(t1:Post) -[:HAS_CREATOR]->(t2:Person) + PER(s,t1,t2) + ACCUM + IF s.type == "Comment" OR s.content != "" THEN + s.@messageContent = s.content + ELSE + s.@messageContent = t1.imageFile + END, + s.@postId = t1.id, + s.@authorOgId = t2.id, + s.@authorOgFN = t2.firstName, + s.@authorOgLN = t2.lastName + POST-ACCUM (s) @@result += ogPostInfo(s.id, s.@messageContent, + s.creationDate, s.@postId, s.@authorOgId, s.@authorOgFN, s.@authorOgLN); + + PRINT @@result; + +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is3_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is3_v3.gsql new file mode 100644 index 000000000..6702c5c05 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is3_v3.gsql @@ -0,0 +1,18 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IS 3 query description is on page 74 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY is3_v3(VERTEX personId) syntax v3{ + SumAccum @creationDate; + + S = { personId }; + P = + SELECT t + FROM (s:S)-[e:KNOWS]-(t:Person) + ACCUM t.@creationDate += datetime_to_epoch(e.creationDate) + ORDER BY t.@creationDate DESC, t.id ASC; + + PRINT P[ + P.id AS personId, + P.firstName AS firstName, + P.lastName AS lastName, + epoch_to_datetime(P.@creationDate) AS friendshipCreationDate]; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is4_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is4_v3.gsql new file mode 100644 index 000000000..3c823ce42 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is4_v3.gsql @@ -0,0 +1,31 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IS 4 query description is on page 74 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY is4_v3(STRING messageId) syntax v3{ + SetAccum @@seed; + SumAccum @messageContent; + + @@seed += messageId; + vComments = to_vertex_set(@@seed, "Comment"); + + IF vComments.size() > 0 THEN + PRINT vComments[ + vComments.creationDate AS messageCreationDate, + vComments.content AS messageContent] AS result; + ELSE + vPost = to_vertex_set(@@seed, "Post"); + vPost = + SELECT v + FROM (v:vPost) + ACCUM + CASE + WHEN v.content != "" THEN + v.@messageContent += v.content + ELSE + v.@messageContent += v.imageFile + END; + + PRINT vPost[ + vPost.creationDate AS messageCreationDate, + vPost.@messageContent AS messageContent] AS result; + END; +} \ No newline at end of file diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is5_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is5_v3.gsql new file mode 100644 index 000000000..1c14c28c2 --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is5_v3.gsql @@ -0,0 +1,24 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IS 5 query description is on page 74 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY is5_v3(STRING messageId) syntax v3{ + SetAccum @@seed; + + @@seed += messageId; + vComments = to_vertex_set(@@seed, "Comment"); + + IF vComments.size() > 0 THEN + P = + SELECT t + FROM (s:vComments)-[:HAS_CREATOR]->(t:Person); + ELSE + vPost = to_vertex_set(@@seed, "Post"); + P = + SELECT t + FROM (s:vPost)-[:HAS_CREATOR]->(t:Person); + END; + + PRINT P[ + P.id AS personId, + P.firstName AS firstName, + P.lastName AS lastName]; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is6_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is6_v3.gsql new file mode 100644 index 000000000..c180e19ab --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is6_v3.gsql @@ -0,0 +1,26 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IS 6 query description is on page 74 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY is6_v3(STRING messageId) syntax v3{ + SumAccum @forumId; + SumAccum @forumTitle; + SetAccum @@seed; + + @@seed += messageId; + vMessage = to_vertex_set(@@seed, "Comment"); + IF vMessage.size() == 0 THEN + vMessage = to_vertex_set(@@seed, "Post"); + END; + + vModerator = + SELECT p + FROM (s:vMessage) -[:REPLY_OF*0..]-> (:Post) <-[:CONTAINER_OF]- (f:Forum) -[:HAS_MODERATOR]->(p:Person) + PER(p,f) + ACCUM p.@forumId = f.id, p.@forumTitle = f.title; + + PRINT vModerator[ + vModerator.@forumId AS forumId, + vModerator.@forumTitle AS forumTitle, + vModerator.id AS moderatorId, + vModerator.firstName AS moderatorFirstName, + vModerator.lastName AS moderatorLastName]; +} diff --git a/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is7_v3.gsql b/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is7_v3.gsql new file mode 100644 index 000000000..29f40adcb --- /dev/null +++ b/tools/ldbc_benchmark/tigergraph/queries/interactive_short/syntax_v3/is7_v3.gsql @@ -0,0 +1,25 @@ +//graph schema is on page 19 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +//IS 7 query description is on page 76 https://ldbc.github.io/ldbc_snb_docs/ldbc-snb-specification.pdf +CREATE OR REPLACE QUERY is7_v3(STRING messageId) syntax v3{ + TYPEDEF TUPLE reply; + + SetAccum @@seed; + SetAccum> @@knows; + HeapAccum(100, commentCreationDate DESC, replyAuthorId ASC) @@result; + + @@seed += messageId; + vMessage = to_vertex_set(@@seed, "Comment"); + IF vMessage.size() == 0 THEN + vMessage = to_vertex_set(@@seed, "Post"); + END; + P = + SELECT p + FROM (s:vMessage) -[:HAS_CREATOR]-> (:Person) -[:KNOWS]- (p:Person) + PER(p) + ACCUM @@knows += p; + P = + SELECT p + FROM (s:vMessage) <-[:REPLY_OF]- (c:Comment) -[:HAS_CREATOR]-> (p:Person) + ACCUM @@result += reply(c.id, c.content, c.creationDate, p.id, p.firstName, p.lastName, p IN @@knows); + PRINT @@result; +}