go-driver
go-driver copied to clipboard
Initiate pregel call
How to initiate a pregel call via /_db/_system/_api/control_pregel?
I call like this, but it does not return result:
func (db *dbService) QueryPregel2(reqParams interface{}) (error, interface{}) {
conn := db.client.Connection()
req, err := conn.NewRequest("POST", path.Join("_db", db.db.Name(), "/_api/control_pregel"))
if err != nil {
DBLogger.Errorf(err.Error())
return err, nil
}
if _, err := req.SetBody(reqParams); err != nil {
DBLogger.Errorf(err.Error())
return err, nil
}
ctx := context.Background()
resp, err := conn.Do(ctx, req)
if err != nil {
DBLogger.Errorf(err.Error())
return err, nil
}
if err := resp.CheckStatus(200); err != nil {
DBLogger.Errorf(err.Error())
return err, nil
}
var result interface{}
if err := resp.ParseBody("", &result); err != nil {
DBLogger.Errorf("parse body error:%v", err.Error())
return err, nil
}
return nil, result
} `
It would probably help to know what reqParams you're passing.
@irridia I believe I'm running into the same issue as the original poster here. My code below produces this error
ERROR:
Code: Unknown
Message: json: cannot unmarshal string into Go value of type map[string]*json.RawMessage
Code:
func (s Server) GetConnectedComponents(ctx context.Context, request *graphv1.GetConnectedComponentsRequest) (*graphv1.GetConnectedComponentsResponse, error) {
log.Debugf("GetConnectedComponents called with: %s", request)
// build request
pregelParams := map[string]interface{}{
"algorithm": "connectedcomponents",
"graphName": request.GetApplication().String(),
"params": map[string]interface{}{
"resultField": "component",
},
}
conn := s.arango.client.Connection()
req, err := conn.NewRequest("POST", path.Join("_db", s.arango.db.Name(), "/_api/control_pregel"))
if err != nil {
log.Errorf("error creating control_pregel request")
return nil, err
}
if _, err := req.SetBody(pregelParams); err != nil {
log.Errorf("error setting control_pregel request params")
return nil, err
}
// make request
resp, err := conn.Do(ctx, req)
if err != nil {
log.Errorf("error executing control_pregel request")
return nil, err
}
if err := resp.CheckStatus(200); err != nil {
log.Errorf("error checking control_pregel response status")
return nil, err
}
var result string
if err := resp.ParseBody("id", &result); err != nil {
log.Errorf("error parsing control_pregel response: %v", resp)
return nil, err
}
log.Debugf("result: %s", result)
// TODO: wait for pregel to complete and query for nodes in CCs?
// map response
log.Debug("GetConnectedComponents request finished")
response := &graphv1.GetConnectedComponentsResponse{
ConnectedComponents: nil,
}
return response, nil
}
I assume I'm just not parsing the response correctly. I see the documentation suggests the response will contain the string id of the pregel job initiated by the request, but I've been unable to parse the response body with any combination of result type or ParseBody field parameter value.
Pregel API has been added to the driver https://github.com/arangodb/go-driver/commit/95925b1e1ece53d6d5a6a04a603d9f357134cd1e
Please use it instead of raw request.