It registers janusgraph.RelationIdentifier
generated by JanusGraph when trying to
do path().by(elementMap())
which is raising a Serialization error.
E0409: unknown custom data type to deserialize janusgraph.RelationIdentifier
Linked to issues:
package gremlin | |
import ( | |
"encoding/binary" | |
"errors" | |
"fmt" | |
gremlingo "github.com/apache/tinkerpop/gremlin-go/v3/driver" | |
) | |
const ( | |
valueFlagNone byte = 0 | |
) | |
func readTemp(data *[]byte, i *int, len int) *[]byte { | |
tmp := make([]byte, len) | |
for j := 0; j < len; j++ { | |
tmp[j] = (*data)[j+*i] | |
} | |
*i += len | |
return &tmp | |
} | |
func readUint32Safe(data *[]byte, i *int) uint32 { | |
return binary.BigEndian.Uint32(*readTemp(data, i, 4)) | |
} | |
func readByteSafe(data *[]byte, i *int) byte { | |
*i++ | |
return (*data)[*i-1] | |
} | |
func readLongSafe(data *[]byte, i *int) int64 { | |
return int64(binary.BigEndian.Uint64(*readTemp(data, i, 8))) | |
} | |
func readString(data *[]byte, i *int) (interface{}, error) { | |
sz := int(readUint32Safe(data, i)) | |
if sz == 0 { | |
return "", nil | |
} | |
*i += sz | |
return string((*data)[*i-sz : *i]), nil | |
} | |
// janusgraphRelationIdentifierReader reads a JanusGraph relation identifier from the given byte slice. | |
// It expects the data to be in a specific format and returns a map containing the relation identifier details. | |
// | |
// The format is as follows: | |
// - 4 bytes: custom data type (0x1001) | |
// - 1 byte: value flag (0x00) | |
// - 1 byte: outVertexId type (0x00 for long, 0x01 for string) | |
// - if 0x00: 8 bytes: outVertexId (long) | |
// - if 0x01: 4 bytes: outVertexId length, followed by outVertexId string | |
// - 8 bytes: typeId (long) | |
// - 8 bytes: relationId (long) | |
// - 1 byte: inVertexId type (0x00 for long, 0x01 for string) | |
// - if 0x00: 8 bytes: inVertexId (long) | |
// - if 0x01: 4 bytes: inVertexId length, followed by inVertexId string | |
// | |
// https://github.com/JanusGraph/janusgraph-python/blob/cd812fc0614047d25a2cabd143902806a74a8465/janusgraph_python/structure/io/graphbinaryV1.py#L133 | |
func janusgraphRelationIdentifierReader(data *[]byte, i *int) (interface{}, error) { | |
const relationIdentifierType = 0x1001 | |
const ( | |
longMarker = 0 | |
stringMarker = 1 | |
) | |
// expect type code | |
customDataTyp := readUint32Safe(data, i) | |
if customDataTyp != relationIdentifierType { | |
return nil, fmt.Errorf("unknown type code. got 0x%x, expected 0x%x", customDataTyp, relationIdentifierType) | |
} | |
// value flag, expect this to be non-nullable | |
if readByteSafe(data, i) != valueFlagNone { | |
return nil, errors.New("expected non-null value") | |
} | |
// outVertexId | |
var ( | |
outVertexID any | |
err error | |
) | |
if readByteSafe(data, i) == stringMarker { | |
outVertexID, err = readString(data, i) | |
if err != nil { | |
return nil, fmt.Errorf("unable to read outVertexId: %w", err) | |
} | |
} else { | |
outVertexID = readLongSafe(data, i) | |
} | |
typeID := readLongSafe(data, i) | |
// relationID | |
relationID := readLongSafe(data, i) | |
// inVertexId | |
var inVertexID any | |
if readByteSafe(data, i) == stringMarker { | |
inVertexID, err = readString(data, i) | |
if err != nil { | |
return nil, fmt.Errorf("unable to read inVertexId: %w", err) | |
} | |
} else { | |
inVertexID = readLongSafe(data, i) | |
} | |
return map[string]any{ | |
"outVertexId": outVertexID, | |
"typeId": typeID, | |
"relationId": relationID, | |
"inVertexId": inVertexID, | |
}, nil | |
} | |
func init() { | |
// https://issues.apache.org/jira/browse/TINKERPOP-2802 | |
gremlingo.RegisterCustomTypeReader("janusgraph.RelationIdentifier", janusgraphRelationIdentifierReader) | |
} |
It registers janusgraph.RelationIdentifier
generated by JanusGraph when trying to
do path().by(elementMap())
which is raising a Serialization error.
E0409: unknown custom data type to deserialize janusgraph.RelationIdentifier
Linked to issues: