Hello all,
I am using UDF to do some processing in C++. I am using getvid() to pass a unique INT ID of a vertex to my C++ UDF so that I do not have to convert a VERTEX primary ID to an INT and at the end of processing I have a subset of VID’s left. How do I access the VERTEX using vid? I want to be able to display the VERTICES using vid. I can always do a SELECT p FROM list:p where getvid(p) == returned_vid, but that will be slow.
Thank you,
Kumar
Currently, we don’t support this vid to vertex function. I added it to our wish list.
Here is a workaround. You can define a boolean expression function, which takes a vertex as its argument. Inside the function, you can use v.vid to access its internal id.
//return true if a survives this function.
**bool** exprUDF(Vertex v) {
uint64_t vid = a.vid;
//processing
return true; //if v should be kept. return false otherwise.
}
Query{
SetAccum<Vertex> @@result;
R = SELECT v
FROM Seed:v
ACCUM CASE WHEN exprUDF (v) THEN
@@result += v;
END;
Print @@result;
}
Hi Kumar,
From your expression function, you can directly convert your uint_64 to a vertex type. For example:
uint_64 int_var = 11;
return VERTEX (int_var);
In the future, we may provide built-in UDF for this.
Thanks.
That should do it! So it will not create a new vertex if a vertex with that vid exists?
You can consider that as type conversion, nothing is physically changed.
Hi @Jon_Herke
I have a similar case, I defined a set of vertices, population = {Person.*}, after my UDF function, I got a list of ID of type INT, I should find back the vertex through the ID, I declared a UDF function
uint64_t getvidID(int64_t ID){
return getvid(VERTEX(ID));
}
But I found, the returned value sometimes is negative, and it has no relationship with vertices union population, because population has a type of VERTEX, not VERTEX. And if I use getvid to every Person in population, the returned value is quite normal. So how can I get the proper Vertex with ID number
UDF function:
inline ListAccum<uint64_t> udf_getvidId() {
ListAccum<uint64_t> ids;
for(int i = 0; i < 15; ++i){
ids += getvid(VERTEX(i));
}
return ids;
}
In GSQL:
start = {Person.*};
tmp0 = SELECT s FROM start:s
ACCUM file1.println(getvid(s));
@@Iddd = udf_getvidId();
PRINT @@Iddd;
In this test, @Iddd shows 0~14, but the vid in start union has a very different internal IDs