Writing cyclic queries using GSQL

Hello,

I am looking at getting all instances of the following two patterns on a particular input graph using TigerGraph.

(a)->(b), (b)->©, (a)->© & (a)->(b), (b)->(d), (a)->©, ©->(d)

My goal is to return the tuples of each i.e. [a, b, c] and [a,b,c,d] or any ordering that TigerGraph would allow for.

I am unclear on how to deal with cyclic queries using GSQL.

Thank you,

Amine.

Hi Amine,

Can you provide more details on the description of the problem?

  1. What is a, b, c, d? Four vertex id or vertex type?

  2. what does the following patterns mean

(a)->(b), (b)->©, (a)->© & (a)->(b), (b)->(d), (a)->©, ©->(d)

We usually describe the path pattern as a chain with vertex type and edge type for each step, i.e. a-(e1)->b-(e2)->c-(e3)->d, indicating a path with starting vertex type a and then followed the edge type e1 arriving at vertex type b, and then following edge type e2 arriving at vertex type c and …

Best Wishes,

Dan

  1. so a,b, c, d are variable names where each one of them will map to a vertex Id.

In those patterns, my goal is to not add types.

  1. I am able to run path queries but I am interested in non path queries. How do I close the loop.

That is how would I implement the following a-(e1)->b-(e2)->c-(e3)->a?

Hi Amine,

In your graph pattern matching problem, are you using isomorphism semantic or homomorphism semantic? Or more specifically, in the pattern (a)->(b)->©<-(a), can b and c be matched to the same vertex, or they have to be matched to different vertices?

Best,
Renchu

My datasets do not have self loops so b and c cannot be matched to the same vertex id.

Hi Amine,

Here is one possible implementation for your 1st pattern: (a)->(b), (b)->(c), (a)->(c). This implementation uses query calling query feature, and is not necessarily the optimal implementation:

CREATE QUERY onePatternABC(vertex a) FOR GRAPH AntiFraud returns (ListAccum<ListAccum>) {
ListAccum<ListAccum> @@result;
ListAccum @edgeFromA;
OrAccum @visited;
A = { a };
BorC = select tgt
from A -(:e)-> :tgt
accum tgt.@edgeFromA += e, tgt.@visited = true;
C = select c
from BorC:b -(:e)-> :c
where c.@visited
accum @@result += [b.@edgeFromA.get(0), e, c.@edgeFromA.get(0)];
return @@result;
}
CREATE QUERY allPatternsABC() FOR GRAPH AntiFraud {
ListAccum<ListAccum> @@result;
A = { any };
AllA = select a
from A:a
accum @@result += onePatternABC(a);
print @@result;
}

Here is the query result of a sample graph:

Best,

Renchu