简体   繁体   English

Neo4jClient - 如何获取节点?

[英]Neo4jClient - How to get node?

I'm trying out the Neo4jClient for Neo4j graph database, using the examples found here . 我正在尝试Neo4jClient for Neo4j图形数据库,使用此处的示例。

In the following fairly simple code: 在下面相当简单的代码中:

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);

On the last line ( .Get ) the following error is thrown: 在最后一行( .Get )上抛出以下错误:

An item with the same key has already been added.

(the same error is thrown even if the Get is the first and only method, and I'm getting the node by using some existing key created previously). (即使Get是第一个也是唯一的方法,也会抛出相同的错误,并且我通过使用先前创建的一些现有密钥来获取节点)。

After looking at the stack trace I found that it's related to Neo4jClient, rather than Neo4j db, because as it seems it's an error thrown when adding to Dictionary: 在查看堆栈跟踪后,我发现它与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)

If relevant, these are the package versions from NuGet: 如果相关,这些是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" />

What am I doing wrong here? 我在这做错了什么?

Edit MyNode class: 编辑 MyNode类:

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

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

Unless you really need to do it, I would take off the [JsonProperty("Bar")] bit, as that is what is causing the trouble. 除非你真的需要这样做,否则我会取消[JsonProperty("Bar")]位,因为这就是造成麻烦的原因。 The deserialiser can't distinguish between the actual property 'Bar', and the JsonProperty 'Bar' deserialiser无法区分实际属性'Bar'和JsonProperty'Bar'

If you take it off, your code will work fine. 如果你把它取下,你的代码将正常工作。

If you want to use the Json stuff, you could create another Node object: 如果你使用Json的东西,你可以创建另一个Node对象:

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

and deserialise into that: 并反序:

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

and that will work. 这将有效。

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

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