[ https://issues.apache.org/jira/browse/TINKERPOP-2581?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17364895#comment-17364895 ]
Florian Hockmann commented on TINKERPOP-2581: --------------------------------------------- This sounds to me like Cosmos DB didn't send a valid GraphSON 3 message as [GraphSON 3 specifies|https://tinkerpop.apache.org/docs/current/dev/io/#_integer_2] that numerical types should be serialized like an object. The Cosmos DB docs also still [mention that they don't support GraphSON 3|https://docs.microsoft.com/en-us/azure/cosmos-db/gremlin-support#unsupported-features]. So, this is not a bug in Gremlin.NET but a known limitation of Cosmos DB. > Gremlin.NET throwing an exception when having to deserialize Numbers in edges > ----------------------------------------------------------------------------- > > Key: TINKERPOP-2581 > URL: https://issues.apache.org/jira/browse/TINKERPOP-2581 > Project: TinkerPop > Issue Type: Bug > Components: dotnet > Affects Versions: 3.5.0 > Environment: Azure CosmosDB graph > Reporter: Fredy > Priority: Major > > We use Gremlin.NET against a CosmosDB graph and have upgraded our projects > from 3.4.10 to 3.5.0 which I understand changed serialization to use > System.Text.Json. > We discovered that many of our queries that ended up retrieving edges were > failing with the following ArgumentOutOfRangeException exception: > {code:java} > JSON type not supported.Parameter name: ValueKindActual value was Number. > {code} > > We determined this happens for queries retrieving edges that have Number type > JSON properties, most likely because Number is not considered in the ToObject > method: > [https://github.com/apache/tinkerpop/blob/a7181e23421818948de3624743d79361524c0013/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONReader.cs#L103] > > A workaround that seems to work is instantiate our Gremlin.NET client with a > subclass of GraphSON2Reader that accounts for this, but for the time being > we've decided to rollback the update instead. > > Here's some code that triggers the issue, at least when using the CosmosDB > backend which is what we use: > {code:java} > using Gremlin.Net.Driver; > using Gremlin.Net.Structure.IO.GraphSON; > using System; > using System.Text.Json; > using System.Threading.Tasks;namespace GremlinNetTest > { > class Program > { > static async Task Main(string[] _) > { > var (hostname, port, username, password) = ( > "<redacted>", > 443, > "<redacted>", > "<redacted>" > ); > var server = new GremlinServer(hostname, port, enableSsl: true, > username, password); > var client = new GremlinClient(server, new > GraphSON2MessageSerializer(new GraphSON2Reader(), new GraphSON2Writer())); > // Create vertexes. > var (v1Id, v2Id) = (Guid.NewGuid().ToString(), > Guid.NewGuid().ToString()); > await > client.SubmitAsync<dynamic>($"g.addV('item').property('id','{v1Id}').property('pk','0')"); > await > client.SubmitAsync<dynamic>($"g.addV('item').property('id','{v2Id}').property('pk','0')"); > // Create edge with string property works. > await > client.SubmitAsync<dynamic>($"g.V(['0','{v1Id}']).addE('works').to(g.V(['0','{v2Id}'])).property('hello','world')"); > // Create edge with number property fails to deserialize result. > // ** FAILS ** > await > client.SubmitAsync<dynamic>($"g.V(['0','{v1Id}']).addE('fails').to(g.V(['0','{v2Id}'])).property('number', > 1)"); > await > client.SubmitAsync<dynamic>($"g.V(['0','{v1Id}']).addE('fails').to(g.V(['0','{v2Id}'])).property('long', > 3147483647)"); > await > client.SubmitAsync<dynamic>($"g.V(['0','{v1Id}']).addE('fails').to(g.V(['0','{v2Id}'])).property('decimal', > 1.5)"); > // ** /FAILS ** // Create edge with number property > works to deserialize result with custom reader. > var clientWithCustomReader = new GremlinClient(server, new > GraphSON2MessageSerializer(new CustomReader(), new GraphSON2Writer())); > await > clientWithCustomReader.SubmitAsync<dynamic>($"g.V(['0','{v1Id}']).addE('works').to(g.V(['0','{v2Id}'])).property('number', > 1)"); > await > clientWithCustomReader.SubmitAsync<dynamic>($"g.V(['0','{v1Id}']).addE('works').to(g.V(['0','{v2Id}'])).property('long', > 3147483647)"); > await > clientWithCustomReader.SubmitAsync<dynamic>($"g.V(['0','{v1Id}']).addE('works').to(g.V(['0','{v2Id}'])).property('decimal', > 1.5)"); > } > } public class CustomReader : GraphSON2Reader > { > public override dynamic ToObject(JsonElement graphSon) > { > if (graphSon.ValueKind == JsonValueKind.Number) > { > if (graphSon.TryGetInt32(out int intValue)) return intValue; > if (graphSon.TryGetInt64(out long longValue)) return > longValue; > if (graphSon.TryGetDecimal(out decimal decimalValue)) return > decimalValue; > } > return base.ToObject(graphSon); > } > } > } > {code} -- This message was sent by Atlassian Jira (v8.3.4#803005)