Skip to content

Commit f0f375e

Browse files
committed
add syntax v3 queries
1 parent 36abb1b commit f0f375e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1497
-0
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# datetime is a reserved keyword so we use date here.
2+
CREATE OR REPLACE DISTRIBUTED QUERY bi1(DATETIME date) SYNTAX v3{
3+
4+
TYPEDEF TUPLE <INT year, BOOL isComment, INT lengthCategory, INT messageCount,
5+
DOUBLE averageMessageLength, INT sumMessageLength, DOUBLE percentageOfMessages> RESULT;
6+
7+
HeapAccum<RESULT>(0, year DESC, isComment ASC, lengthCategory ASC) @@result;
8+
GroupByAccum<INT year, BOOL isComment, INT lengthCategory,
9+
SumAccum<INT> messageCount, SumAccum<INT> sumMessageLength> @@midResult;
10+
11+
OrAccum @isComment;
12+
SumAccum<INT> @lengthCategory;
13+
14+
UINT total;
15+
INT epoch = datetime_to_epoch(date) * 1000;
16+
messages = SELECT m FROM (m:Comment:Post) WHERE m.creationDate < epoch;
17+
total = messages.size();
18+
messages =
19+
SELECT m FROM (m:messages)
20+
WHERE m.length > 0
21+
ACCUM
22+
m.@isComment = (m.type == "Comment"),
23+
IF m.length < 40 THEN
24+
m.@lengthCategory = 0
25+
ELSE IF m.length < 80 THEN
26+
m.@lengthCategory = 1
27+
ELSE IF m.length < 160 THEN
28+
m.@lengthCategory = 2
29+
ELSE
30+
m.@lengthCategory = 3
31+
END
32+
POST-ACCUM @@midResult += (year(epoch_to_datetime(m.creationDate/1000)), m.@isComment, m.@lengthCategory -> 1, m.length);
33+
34+
@@result.resize(@@midResult.size());
35+
FOREACH m IN @@midResult DO
36+
@@result += RESULT(m.year, m.isComment, m.lengthCategory, m.messageCount,
37+
(m.sumMessageLength * 1.0 / m.messageCount), m.sumMessageLength, (m.messageCount * 1.0 / total));
38+
END;
39+
40+
PRINT @@result as result;
41+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
CREATE OR REPLACE DISTRIBUTED QUERY bi10(VERTEX<Person> personId, STRING country, STRING tagClass) SYNTAX v3 {
2+
TYPEDEF TUPLE <UINT personId, STRING tagName, UINT messageCount> RESULT;
3+
OrAccum @visited, @selected;
4+
SetAccum<VERTEX<Tag>> @tags;
5+
MapAccum<VERTEX<Tag>, SumAccum<UINT>> @messageCount;
6+
HeapAccum<RESULT> (100, messageCount DESC, tagName ASC, personId ASC) @@result;
7+
8+
candidates = SELECT p FROM (cn:Country {name:country}) <-[:IS_PART_OF]-()<-[:IS_LOCATED_IN]- (p:Person);
9+
10+
S = {personId};
11+
UINT pathLength = 0;
12+
S = SELECT s FROM (s:S) ACCUM s.@visited = TRUE;
13+
WHILE pathLength < 3 DO
14+
S =
15+
SELECT t
16+
FROM (s:S) -[:KNOWS]- (t:Person)
17+
WHERE NOT t.@visited
18+
POST-ACCUM t.@visited = TRUE;
19+
pathLength += 1;
20+
END;
21+
# Here, S is the Person with shortest length of 3
22+
persons = SELECT t
23+
FROM (s:S) -[:KNOWS]- (t:Person)
24+
WHERE NOT t.@visited;
25+
persons = (persons UNION S) INTERSECT candidates;
26+
27+
messages = SELECT m
28+
FROM (p:persons) <-[:HAS_CREATOR]- (m:Comment:Post)
29+
ACCUM m.@selected += TRUE;
30+
31+
messages = SELECT m
32+
FROM (tc:TagClass {name:tagClass}) <-[:HAS_TYPE]- (t:Tag) <-[:HAS_TAG]- (m:Comment:Post)
33+
WHERE m.@selected;
34+
35+
messages = SELECT m
36+
FROM (m:messages) -[:HAS_TAG]-> (t:Tag)
37+
ACCUM m.@tags += t;
38+
39+
persons = SELECT p
40+
FROM (m:messages) -[:HAS_CREATOR]-> (p:Person)
41+
ACCUM
42+
FOREACH t IN m.@tags DO
43+
p.@messageCount += (t -> 1)
44+
END
45+
POST-ACCUM
46+
FOREACH (t,cnt) IN p.@messageCount DO
47+
@@result += RESULT(p.id, t.name, cnt)
48+
END;
49+
PRINT @@result as result;
50+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
CREATE OR REPLACE DISTRIBUTED QUERY bi11(STRING country, DATETIME startDate, DATETIME endDate) SYNTAX v3 {
2+
SumAccum<UINT> @@result;
3+
OrAccum<BOOL> @selected;
4+
SetAccum<VERTEX<Person>> @oneHopNeighbor;
5+
6+
persons = SELECT p FROM (cn:Country {name:country}) <-[:IS_PART_OF]-()<-[:IS_LOCATED_IN]- (p:Person)
7+
ACCUM p.@selected += True;
8+
9+
INT startEpoch = datetime_to_epoch(startDate) * 1000;
10+
INT endEpoch = datetime_to_epoch(endDate) * 1000;
11+
12+
P2 = SELECT p2
13+
FROM (p1:persons) -[e:KNOWS]- (p2:Person)
14+
WHERE p2.@selected AND (e.creationDate BETWEEN startEpoch AND endEpoch) AND p1.id < p2.id
15+
ACCUM p2.@oneHopNeighbor += p1;
16+
17+
P3 = SELECT p3
18+
FROM (p2:P2) -[e:KNOWS]- (p3:Person)
19+
WHERE p3.@selected AND (e.creationDate BETWEEN startEpoch AND endEpoch) AND p2.id < p3.id
20+
ACCUM FOREACH p1 IN p2.@oneHopNeighbor DO
21+
IF p1 IN p3.@oneHopNeighbor THEN
22+
@@result += 1
23+
END
24+
END;
25+
26+
PRINT @@result as result;
27+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
CREATE OR REPLACE DISTRIBUTED QUERY bi12(DATETIME startDate, INT lengthThreshold, SET<STRING> languages) SYNTAX v3 {
2+
3+
TYPEDEF TUPLE <UINT messageCount, UINT personCount> RESULT;
4+
MapAccum<UINT, UINT> @@personCount;
5+
HeapAccum<RESULT>(0, personCount DESC, messageCount DESC) @@result;
6+
SumAccum<UINT> @messageCount;
7+
INT diff;
8+
INT startEpoch = datetime_to_epoch(startDate) * 1000;
9+
10+
posts = SELECT p FROM (p:Post) WHERE p.language IN languages;
11+
M = SELECT m FROM (p:posts)<-[:ROOT_POST]- (m:Comment:Post);
12+
M = M UNION posts;
13+
M = SELECT m FROM (m:M)
14+
WHERE m.length > 0
15+
AND m.length < lengthThreshold
16+
AND m.creationDate > startEpoch;
17+
18+
persons =
19+
SELECT p
20+
FROM (:M) -[:HAS_CREATOR]-> (p:Person)
21+
ACCUM p.@messageCount += 1
22+
POST-ACCUM @@personCount += (p.@messageCount -> 1);
23+
24+
allPersons = {Person.*};
25+
diff = allPersons.size() - persons.size();
26+
IF diff > 0 THEN
27+
@@personCount += (0 -> diff);
28+
END;
29+
30+
@@result.resize(@@personCount.size());
31+
FOREACH (messageCount, personCount) IN @@personCount DO
32+
@@result += RESULT(messageCount, personCount);
33+
END;
34+
35+
PRINT @@result as result;
36+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
CREATE OR REPLACE DISTRIBUTED QUERY bi13(STRING country, DATETIME endDate) SYNTAX v3 {
2+
3+
TYPEDEF TUPLE <UINT zombieId, UINT zombieLikeCount, UINT totalLikeCount, DOUBLE zombieScore> RESULT;
4+
HeapAccum<RESULT>(100, zombieScore DESC, zombieId ASC) @@result;
5+
OrAccum<BOOL> @selected;
6+
SumAccum<UINT> @messageCount;
7+
SumAccum<UINT> @totalLikeCount;
8+
SumAccum<UINT> @zombieLikeCount;
9+
INT endEpoch = datetime_to_epoch(endDate) * 1000;
10+
11+
zombieCandidates =
12+
SELECT p FROM (cn:Country {name:country}) <-[:IS_PART_OF]-()<-[:IS_LOCATED_IN]- (p:Person)
13+
WHERE p.creationDate < endEpoch;
14+
15+
tmp =
16+
SELECT p
17+
FROM (p:zombieCandidates) <-[:HAS_CREATOR]- (m:Comment:Post)
18+
WHERE m.creationDate < endEpoch
19+
ACCUM p.@messageCount += 1;
20+
21+
zombies =
22+
SELECT p
23+
FROM (p:zombieCandidates)
24+
WHERE p.@messageCount < (year(endDate) - year(epoch_to_datetime(p.creationDate/1000))) * 12 +
25+
(month(endDate) - month(epoch_to_datetime(p.creationDate/1000))) + 1
26+
ACCUM p.@selected += true;
27+
28+
M = SELECT m FROM (z:zombies) <-[:HAS_CREATOR]- (m:Comment:Post);
29+
30+
tmp = SELECT p FROM (m:M) <-[:LIKES]- (p:Person)
31+
WHERE p.creationDate < endEpoch
32+
ACCUM
33+
m.@totalLikeCount += 1,
34+
IF p.@selected THEN
35+
m.@zombieLikeCount += 1
36+
END;
37+
38+
tmp = SELECT m FROM (m:M) -[:HAS_CREATOR]-> (p:Person)
39+
ACCUM p.@totalLikeCount += m.@totalLikeCount, p.@zombieLikeCount += m.@zombieLikeCount;
40+
41+
zombies =
42+
SELECT z FROM (z:zombies)
43+
POST-ACCUM
44+
IF z.@totalLikeCount > 0 THEN
45+
@@result += RESULT(z.id, z.@zombieLikeCount, z.@totalLikeCount, 1.0 * z.@zombieLikeCount / z.@totalLikeCount)
46+
ELSE
47+
@@result += RESULT(z.id, 0, 0, 0.0)
48+
END;
49+
50+
PRINT @@result as result;
51+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
CREATE OR REPLACE DISTRIBUTED QUERY bi14(STRING country1, STRING country2) SYNTAX v3 {
2+
TYPEDEF TUPLE<UINT person1Id, UINT person2Id, STRING city1Name, INT score> pairScore;
3+
TYPEDEF TUPLE <UINT pid, UINT score> ps;
4+
5+
HeapAccum<ps>(1, score DESC, pid ASC) @pScore;
6+
MapAccum<VERTEX<Person>, UINT> @score;
7+
MinAccum<VERTEX<Person>> @person2;
8+
SetAccum<VERTEX<Person>> @knows, @p2s1, @p2s2, @p2s3, @p2s4;
9+
OrAccum @valid, @selected;
10+
HeapAccum<pairScore>(1, score DESC, person1Id ASC, person2Id ASC) @cityresults;
11+
HeapAccum<pairScore>(100, score DESC, person1Id ASC, person2Id ASC) @@result;
12+
MinAccum<UINT> @min_pid2;
13+
14+
P1candidate = SELECT p
15+
FROM (cn:Country {name:country1}) <-[:IS_PART_OF]-()<-[:IS_LOCATED_IN]-(p:Person);
16+
17+
P2candidate =
18+
SELECT p2
19+
FROM (cn:Country {name:country2}) <-[:IS_PART_OF]-()<-[:IS_LOCATED_IN]-(p2:Person)
20+
ACCUM p2.@selected += true;
21+
22+
P2 =
23+
SELECT p2 FROM (p1:P1candidate) -[:KNOWS]- (p2:Person)
24+
WHERE p2.@selected
25+
ACCUM p1.@valid += True,
26+
p1.@knows += p2,
27+
p1.@min_pid2 += p2.id;
28+
29+
P1 = SELECT p FROM (p:Person) WHERE p.@valid;
30+
# Case 1
31+
tmp = SELECT p1 FROM (p1:P1) -[e:REPLY_COUNT]-> (p2:Person)
32+
WHERE p2.@selected AND e.cnt > 0
33+
ACCUM p1.@score += (p2 -> 4);
34+
35+
# Case 2
36+
tmp = SELECT p1 FROM (p1:P1) <-[e:REPLY_COUNT]- (p2:Person)
37+
WHERE p2.@selected AND e.cnt > 0
38+
ACCUM p1.@score += (p2 -> 1);
39+
40+
# Case 3
41+
M2 = SELECT m2 FROM (p:P2) <-[:HAS_CREATOR]- (m2)
42+
ACCUM m2.@p2s3 += p;
43+
tmp = SELECT p1 FROM (m2:M2) <-[:LIKES]- (p1:Person)
44+
WHERE p1.@valid
45+
ACCUM p1.@p2s3 += m2.@p2s3
46+
POST-ACCUM p1.@p2s3 = (p1.@p2s3 INTERSECT p1.@knows);
47+
48+
# Case 4
49+
M2 = SELECT m2 FROM (p2:P2) -[:LIKES]-> (m2)
50+
ACCUM m2.@p2s4 += p2;
51+
tmp = SELECT p1 FROM (m2:M2) -[:HAS_CREATOR]-> (p1:Person)
52+
WHERE p1.@valid
53+
ACCUM p1.@p2s4 += m2.@p2s4
54+
POST-ACCUM p1.@p2s4 = (p1.@p2s4 INTERSECT p1.@knows);
55+
56+
P1 = SELECT p1 FROM (p1:P1)
57+
ACCUM
58+
FOREACH p2 IN p1.@p2s3 DO
59+
p1.@score += (p2 -> 10)
60+
END,
61+
FOREACH p2 IN p1.@p2s4 DO
62+
p1.@score += (p2 -> 1)
63+
END
64+
POST-ACCUM
65+
FOREACH (p2,score) IN p1.@score DO
66+
p1.@pScore += ps(p2.id,score)
67+
END;
68+
69+
City1 = SELECT c1 FROM (p1:P1) -[:IS_LOCATED_IN]-> (c1:City)
70+
ACCUM
71+
IF p1.@pScore.size() > 0 THEN
72+
c1.@cityresults += pairScore(p1.id, p1.@pScore.top().pid, c1.name, p1.@pScore.top().score)
73+
ELSE
74+
c1.@cityresults += pairScore(p1.id, p1.@min_pid2, c1.name, 0)
75+
END;
76+
77+
City1 = SELECT c1 FROM (c1:City1)
78+
ACCUM @@result += c1.@cityresults.top();
79+
PRINT @@result as result;
80+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
//USE GRAPH ldbc_snb
2+
CREATE OR REPLACE DISTRIBUTED QUERY bi15(VERTEX<Person> person1Id, VERTEX<Person> person2Id, DATETIME startDate, DATETIME endDate) syntax v3 {
3+
MinAccum<DOUBLE> @@result, @dis;
4+
OrAccum @next;
5+
SetAccum<VERTEX<Person>> @creator;
6+
MapAccum<VERTEX<Person>, SumAccum<UINT>> @replyCount;
7+
OrAccum @visited;
8+
INT startEpoch = datetime_to_epoch(startDate) * 1000;
9+
INT endEpoch = datetime_to_epoch(endDate) * 1000;
10+
11+
F = SELECT f FROM (f:Forum) WHERE f.creationDate BETWEEN startEpoch AND endEpoch;
12+
P = SELECT p FROM (:F) -[:CONTAINER_OF]-> (p:Post);
13+
M = SELECT m FROM (:P) <-[:ROOT_POST]- (m:Comment) ACCUM m.@visited += true;
14+
M = M UNION P;
15+
tmp = SELECT p FROM (m:M) -[:HAS_CREATOR]-> (p:Person) ACCUM m.@creator += p;
16+
M1 = SELECT m1 FROM (m1:M) <-[:REPLY_OF]- (m2:Comment)
17+
WHERE m2.@visited
18+
ACCUM
19+
UINT w = 1,
20+
IF m1.type == "Post" THEN w = 2 END,
21+
FOREACH p1 IN m1.@creator DO
22+
FOREACH p2 IN m2.@creator DO
23+
p1.@replyCount += (p2 -> w)
24+
END
25+
END;
26+
P = {Person.*};
27+
@@result = P.size();
28+
S = {person1Id};
29+
S = SELECT s FROM (s:S) ACCUM s.@dis = 0;
30+
WHILE S.size()>0 DO
31+
S = SELECT t FROM (s:S)-[e:KNOWS]-(t:Person)
32+
ACCUM
33+
DOUBLE t_dis = s.@dis + 2.0/(2 + s.@replyCount.get(t) + t.@replyCount.get(s)),
34+
IF t_dis < @@result AND t_dis < t.@dis THEN
35+
t.@dis += t_dis,
36+
t.@next += true,
37+
IF t == person2Id THEN
38+
@@result += t_dis
39+
END
40+
END
41+
HAVING t.@next;
42+
S = SELECT s FROM (s:S) ACCUM s.@next = false;
43+
END;
44+
45+
IF ABS(@@result - P.size()) < 1 THEN
46+
PRINT -1 as result;
47+
ELSE
48+
PRINT @@result as result;
49+
END;
50+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
CREATE OR REPLACE DISTRIBUTED QUERY bi16(STRING tagA, DATETIME dateA,
2+
STRING tagB, DATETIME dateB, UINT maxKnowsLimit) SYNTAX v3 {
3+
4+
TYPEDEF TUPLE <UINT personId, UINT messageCountA, UINT messageCountB, UINT totalMessageCount> RESULT;
5+
HeapAccum<RESULT>(20, totalMessageCount DESC, personId ASC) @@result;
6+
7+
SumAccum<UINT> @knowsCountA, @messageCountA;
8+
SumAccum<UINT> @knowsCountB, @messageCountB;
9+
INT yearA, monthA, dayA;
10+
INT yearB, monthB, dayB;
11+
yearA = year(dateA); monthA = month(dateA); dayA = day(dateA);
12+
yearB = year(dateB); monthB = month(dateB); dayB = day(dateB);
13+
14+
personsA =
15+
SELECT p
16+
FROM (t:Tag {name:tagA}) <-[:HAS_TAG]- (m:Comment:Post) -[:HAS_CREATOR]-> (p:Person)
17+
WHERE
18+
year(epoch_to_datetime(m.creationDate/1000)) == yearA AND
19+
month(epoch_to_datetime(m.creationDate/1000)) == monthA AND
20+
day(epoch_to_datetime(m.creationDate/1000)) == dayA
21+
ACCUM p.@messageCountA += 1;
22+
23+
tmp = SELECT p
24+
FROM (:personsA) -[:KNOWS]- (p:personsA)
25+
ACCUM p.@knowsCountA += 1;
26+
27+
# need to include person without any friends
28+
personsA = SELECT p FROM (p:personsA) WHERE p.@knowsCountA <= maxKnowsLimit;
29+
30+
personsB =
31+
SELECT p
32+
FROM (t:Tag {name:tagB}) <-[:HAS_TAG]- (m:Comment:Post) -[:HAS_CREATOR]-> (p:Person)
33+
WHERE
34+
year(epoch_to_datetime(m.creationDate/1000)) == yearB AND
35+
month(epoch_to_datetime(m.creationDate/1000)) == monthB AND
36+
day(epoch_to_datetime(m.creationDate/1000)) == dayB
37+
ACCUM p.@messageCountB += 1;
38+
39+
tmp = SELECT p FROM (:personsB) -[:KNOWS]- (p:personsB)
40+
ACCUM p.@knowsCountB += 1;
41+
42+
# need to include person without any friends
43+
personsB = SELECT p FROM (p:personsB) WHERE p.@knowsCountB <= maxKnowsLimit;
44+
45+
persons = personsA INTERSECT personsB;
46+
persons =
47+
SELECT p
48+
FROM (p:persons)
49+
POST-ACCUM @@result += RESULT(p.id, p.@messageCountA, p.@messageCountB, p.@messageCountA+p.@messageCountB);
50+
51+
PRINT @@result as result;
52+
}

0 commit comments

Comments
 (0)