如何使用Neo4jclient保存空数组属性

时间:2013-07-30 09:39:43

标签: neo4j neo4jclient

我正在使用neo4jclient,我的一个数据类具有Collection<string>属性。

保存时,我收到以下错误:

  

“无法将属性'SomeArrayPropertyName'设置为空数组,因为,因为那里   没有任何类型的值,也没有预先存在的集合   推断类型,不可能确定要的数组类型   店“。

有没有办法保存空数组而不将其更改为Null?

编辑:

示例:

public class BaseData
{
    public Guid Id { get; set; }
    ...
    ...
    public Collection<string> Subjects { get; set; }

    public BaseData()
    {
        Subjects = new Collection<string>();
    }

    //This method lets Json.Net know whether to serialize 'Subjects'
    public virtual bool ShouldSerializeSubjects()
    {
        return Subjects != null && Subjects.Any();
    }
}

public class ParentData : BaseData
{
}

public class ChildData : ParentData 
{
    public String Name { get; set; }
    public String Description { get; set; }
    ...
    ...
}

2 个答案:

答案 0 :(得分:3)

Neo4jclient使用Json.net来解析数据类,因此可以向Json.net寻找的Data类中添加一个方法,格式为ShouldSerializePROPERTYNAME(参见例子如下)。

public class Actor
{
    public string Name { get;set;}
    public Collection<string> Alternatives { get;set; }

    //This method lets Json.Net know whether to serialize 'Alternatives'
    public bool ShouldSerializeAlternatives()
    {
        return Alternatives != null && Alternatives.Any();
    }
}

这会将new Actor{Name = "Jeff", Alternatives=new Collection<string>()}序列化为:{"Name":"Jeff"} - 完全没有Alternatives

显然,这里的缺点是你的类在反序列化时会有一个空集合 - 你可能没问题,或者没有 - 如果没有 - 你可以在构造函数中粘贴一个初始化器:

public Actor() { Alternatives = new Collection<string>(); }

当Json.Net反序列化对象时将调用它。

使用IContractResolver还有另一种方法,但如果您有权访问数据类,则上述方法最简单。

没有办法绕过空集合而不是序列化它,因为neo4j不允许你发送数据。

- 编辑 -

public class BaseData
{
    public Guid Id { get; set; }
    public Collection<string>  Subjects { get; set; }

    public bool ShouldSerializeSubjects()
    {
        return Subjects != null && Subjects.Any();
    }

    public BaseData()
    {
        Subjects = new Collection<string>();
    }
}

public class ParentData :BaseData {}

public class ChildData : ParentData
{
    public string Name { get; set; }
    public string Description { get; set; }
}

class Program
{
    static void Main()
    {
        var client = new GraphClient(new Uri("http://localhost.:7474/db/data/"));
        client.Connect();

        var cd = new ChildData { Name = "c1", Description = "des", Id = Guid.NewGuid() };
        var nodeRef = client.Create(cd);
        var cdRetrieved = client.Get<ChildData>(nodeRef);

        Console.WriteLine("Name: {0}, Description: {1}, Id: {2}, Subjects: {3}", cd.Name, cd.Description, cd.Id, cd.Subjects.Count);
        Console.WriteLine("Name: {0}, Description: {1}, Id: {2}, Subjects: {3}", cdRetrieved.Data.Name, cdRetrieved.Data.Description, cdRetrieved.Data.Id, cdRetrieved.Data.Subjects.Count);

        var json = JsonConvert.SerializeObject(cd);
        Console.WriteLine(json);
}

提供以下输出:

Name: c1, Description: des, Id: ff21b0fe-0a51-4269-a1d4-e148c905a6d7, Subjects: 0
Name: c1, Description: des, Id: ff21b0fe-0a51-4269-a1d4-e148c905a6d7, Subjects: 0
{"Name":"c1","Description":"des","Id":"ff21b0fe-0a51-4269-a1d4-e148c905a6d7"}

最后一行是Json.Net的实际JSON输出,没有'subject'序列化。

答案 1 :(得分:0)

Neo4j doco粘贴:

  

只有在某些先决条件下才能存储空数组。由于JSON传输格式不包含数组的类型信息,因此可以从数组中的值推断类型。如果数组为空,则Neo4j服务器无法确定类型。在这些情况下,它将检查是否已为给定属性存储数组,并在存储空数组时使用存储的数组类型。如果尚未存在阵列,则服务器将拒绝该请求。

这意味着在更新Neo4j已知数组类型的现有数组时,提供空数组。新的数组属性不能为空。