繁体   English   中英

Neo4jClient - 如何获取节点?

[英]Neo4jClient - How to get node?

我正在尝试Neo4jClient for Neo4j图形数据库,使用此处的示例。

在下面相当简单的代码中:

var client = new GraphClient(new Uri("http://localhost:7474/db/data"));
client.Connect();

var myNodeReference = client.Create(new MyNode { Foo = "bar" });
var myNode = client.Get<MyNode>(myNodeReference);

在最后一行( .Get )上抛出以下错误:

An item with the same key has already been added.

(即使Get是第一个也是唯一的方法,也会抛出相同的错误,并且我通过使用先前创建的一些现有密钥来获取节点)。

在查看堆栈跟踪后,我发现它与Neo4jClient相关,而不是Neo4j db,因为它似乎是在添加到Dictionary时抛出的错误:

 at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
   at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector)
   at Neo4jClient.Deserializer.CommonDeserializerMethods.GetPropertiesForType(Type objType) in c:\TeamCity\buildAgent\work\460e89b30f53245b\Neo4jClient\Deserializer\CommonDeserializerMethods.cs:line 344
   at Neo4jClient.Deserializer.CommonDeserializerMethods.Map(Object targetObject, JToken parentJsonToken, CultureInfo culture, IEnumerable`1 typeMappings, Int32 nestingLevel) in c:\TeamCity\buildAgent\work\460e89b30f53245b\Neo4jClient\Deserializer\CommonDeserializerMethods.cs:line 228
   at Neo4jClient.Deserializer.CommonDeserializerMethods.CreateAndMap(Type type, JToken element, CultureInfo culture, IEnumerable`1 typeMappings, Int32 nestingLevel) in c:\TeamCity\buildAgent\work\460e89b30f53245b\Neo4jClient\Deserializer\CommonDeserializerMethods.cs:line 210
   at Neo4jClient.Deserializer.CommonDeserializerMethods.SetPropertyValue(Object targetObject, PropertyInfo propertyInfo, JToken value, CultureInfo culture, IEnumerable`1 typeMappings, Int32 nestingLevel) in c:\TeamCity\buildAgent\work\460e89b30f53245b\Neo4jClient\Deserializer\CommonDeserializerMethods.cs:line 132
   at Neo4jClient.Deserializer.CommonDeserializerMethods.Map(Object targetObject, JToken parentJsonToken, CultureInfo culture, IEnumerable`1 typeMappings, Int32 nestingLevel) in c:\TeamCity\buildAgent\work\460e89b30f53245b\Neo4jClient\Deserializer\CommonDeserializerMethods.cs:line 234
   at Neo4jClient.Deserializer.CustomJsonDeserializer.Deserialize[T](RestResponse response) in c:\TeamCity\buildAgent\work\460e89b30f53245b\Neo4jClient\Deserializer\CustomJsonDeserializer.cs:line 59
   at RestSharp.RestClient.Deserialize[T](IRestRequest request, RestResponse raw)

如果相关,这些是NuGet的软件包版本:
<package id="Neo4jClient" version="1.0.0.397" targetFramework="net40-Client" />
<package id="Newtonsoft.Json" version="4.0.8" targetFramework="net40-Client" />
<package id="RestSharp" version="102.7" targetFramework="net40-Client" />

我在这做错了什么?

编辑 MyNode类:

[JsonObject]
public class MyNode
{
    [JsonProperty("Bar")]
    public string Foo { get; set; }

    [JsonIgnore]
    public string Bar { get; set; }
}

除非你真的需要这样做,否则我会取消[JsonProperty("Bar")]位,因为这就是造成麻烦的原因。 deserialiser无法区分实际属性'Bar'和JsonProperty'Bar'

如果你把它取下,你的代码将正常工作。

如果你使用Json的东西,你可以创建另一个Node对象:

public class OtherNode { public string Bar { get;set;} }

并反序:

var nodeReference = client.Create(new MyNode { Foo = "blah" });
var retrieved = client.Get<OtherNode>(nodereference);

这将有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM