Search code examples
c#neo4jneo4jclient

Neo4jClient "CASE WHEN" together with return


I'm trying to figure out how to do something like this (simplified):

RETURN CASE WHEN groups IS NOT NULL THEN collect(groups) ELSE NULL END

with Neo4jClient in C#. I've tried this:

.Return((groups) => new
{
    Board = parentBoard.As<Board>(),
    Groups = Return.As<Groups>("CASE WHEN groups IS NOT NULL THEN collect(groups) ELSE NULL END")
});

but it throws an exception. I was unable to find any information about how to do this properly with neo4jclient. The way I did it does seem to return a valid json response, but neo4jclient is apparently unable to read it. Therefore I suspect neo4jclient expects this to be done in some other way? Basically, I want to return null if groups is null, since collect(NULL) does not return just null. Any ideas?

System.ArgumentException: Neo4j returned a valid response, however Neo4jClient was unable to deserialize into the object structure you supplied.

First, try and review the exception below to work out what broke.                                                                          

If it's not obvious, you can ask for help at http://stackoverflow.com/questions/tagged/neo4jclient                                          

Include the full text of this exception, including this message, the stack trace, and all of the inner exception details.                  

Include the full type definition of <>f__AnonymousType2`2[[Kolan.Models.Board, Kolan, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Kolan.Models.Groups, Kolan, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].

Include this raw JSON, with any sensitive values replaced with non-sensitive equivalents:                                                   

{"columns":["Board","Groups"],"data":[[{"extensions":{},"metadata":{"id":370,"labels":["Board"]},"paged_traverse":"http://localhost:7474/db/data/node/370/paged/traverse/{returnType}{?pageSize,leaseTime}","outgoing_relationships":"http://localhost:7474/db/data/node/370/relationshi
ps/out","outgoing_typed_relationships":"http://localhost:7474/db/data/node/370/relationships/out/{-list|&|types}","create_relationship":"http://localhost:7474/db/data/node/370/relationships","labels":"http://localhost:7474/db/data/node/370/labels","traverse":"http://localhost:747
4/db/data/node/370/traverse/{returnType}","all_relationships":"http://localhost:7474/db/data/node/370/relationships/all","all_typed_relationships":"http://localhost:7474/db/data/node/370/relationships/all/{-list|&|types}","property":"http://localhost:7474/db/data/node/370/propert
ies/{key}","self":"http://localhost:7474/db/data/node/370","incoming_relationships":"http://localhost:7474/db/data/node/370/relationships/in","properties":"http://localhost:7474/db/data/node/370/properties","incoming_typed_relationships":"http://localhost:7474/db/data/node/370/re
lationships/in/{-list|&|types}","data":{"name":"empty","description":"An empty board.","id":"Mrw7M8myg"}},[{"boards":[],"group":null}]]]} (Parameter 'content')
 ---> System.ArgumentException: Accessed JArray values with invalid key value: "data". Int32 array index expected.                          
   at Newtonsoft.Json.Linq.JArray.get_Item(Object key)
   at Neo4jClient.Serialization.CommonDeserializerMethods.Map(DeserializationContext context, Object targetObject, JToken parentJsonToken, IEnumerable`1 typeMappings, Int32 nestingLevel)
   at Neo4jClient.Serialization.CommonDeserializerMethods.CreateAndMap(DeserializationContext context, Type type, JToken element, IEnumerable`1 typeMappings, Int32 nestingLevel)
   at Neo4jClient.Serialization.CommonDeserializerMethods.MutateObject(DeserializationContext context, JToken value, IEnumerable`1 typeMappings, Int32 nestingLevel, TypeMapping mapping, Type propertyType)
   at Neo4jClient.Serialization.CommonDeserializerMethods.CoerceValue(DeserializationContext context, PropertyInfo propertyInfo, JToken value, IEnumerable`1 typeMappings, Int32 nestingLevel)
   at Neo4jClient.Serialization.CypherJsonDeserializer`1.<>c__DisplayClass22_0.<ReadProjectionRowUsingCtor>b__0(JToken cell, Int32 cellIndex)
   at System.Linq.Enumerable.SelectIterator[TSource,TResult](IEnumerable`1 source, Func`3 selector)+MoveNext()                              
   at System.Collections.Generic.LargeArrayBuilder`1.AddRange(IEnumerable`1 items)                                                          
   at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source)                                                         
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at Neo4jClient.Serialization.CypherJsonDeserializer`1.ReadProjectionRowUsingCtor(DeserializationContext context, JToken row, IDictionary`2 propertiesDictionary, IList`1 columnNames, IEnumerable`1 jsonTypeMappings, ConstructorInfo ctor)
   at Neo4jClient.Serialization.CypherJsonDeserializer`1.<>c__DisplayClass21_1.<ParseInProjectionMode>b__5(JToken token)                    
   at System.Linq.Enumerable.SelectEnumerableIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at Neo4jClient.Serialization.CypherJsonDeserializer`1.Deserialize(String content)                                                        
   --- End of inner exception stack trace ---

Board class:

public class Board
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("description")]
    public string Description { get; set; }
}

Groups class:

public class Groups
{
    [JsonProperty("group")]
    public Group Group { get; set; }

    [JsonProperty("boards")]
    public IEnumerable<Board> Boards { get; set; }
}

Edit: I also tried squeezing in a ternary conditional: Groups = groups == null ? null : groups.CollectAs<Groups>() but that threw a NotSupportedException, saying "FullConditionalExpression is not supported"


Solution

  • Ah, I solved it. The solution ended up being quite obvious! Return.As<Groups> needed to be Return.As<IEnumerable<Groups>>