Let’s say I have the following list of edges declared somewhere in my GSQL query:
ListAccum<EDGE> @@edges;
which is later populated with edges.
Is it possible to iterate over this list with a FOREACH loop, asking for every edge whether it exists in the graph or not?
Thanks in advance.
Hello,
Yes this is possible and can be done approximately as follows:
ListAccum<EDGE> @@ans;
INT status;
...
FOREACH singleEdge IN @@ans DO
status = 0;
all = {ANY};
check = SELECT s FROM all:s - (:e) - :t
ACCUM if e == singleEdge then status = 1 end;
if status == 1 then
print singleEdge;
end;
END;
However, I can’t help but wonder how you plan on populating @@edges with “fake” edges that don’t actually exist in the graph?
Thanks a lot for your answer.
The thing is that I want to implement this algorithm in GSQL to find all 3-cliques in the graph: https://iq.opengenus.org/algorithm-to-find-cliques-of-a-given-size-k/
As can be seen in the pseudocode, some edges need to be generated to later check if they exist or not.
By a 3-clique, did you mean a triangle?
Or a 4-vertex set connected to the other 3?
We have algorithms to count the triangles. This can be modified to report the triangles.
We also have a k-core algorithm (more general than k-cliques) which could be refined to look only for k-cliques. If you want k > 3, then that would be the approach.