2013-12-01 4 views
1

Это первый раз, когда я пытаюсь использовать Neo4jClient и не имею опыта. Я ожидал, что моя программа сможет распечатать Имя людей с определенным отношением назначено в Neo4j. У меня есть очень простой код:Невозможно получить свойство из запроса в Neo4jClient C#

using Neo4jClient; 
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 

    namespace Neo4J.NET_Labs 
    { 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       var client = new GraphClient(new Uri("http://localhost:7474/db/data")); 
       client.Connect(); 

       var query = client 
        .Cypher 
        .Match("(n)-[:LOVE]-(lover)") 
        .Return(lover => lover.As<Person>()) 
            ; 
       int count = 0; 
       foreach (var result in query.Results) 
       { 
        count++; 
        Console.WriteLine("People {0} count {1}", result.name, count); 
       } 

     //Stop to show result 
     Console.ReadLine(); 
    } 
} 
public class Person 
{ 
    public string name; 
} 

}

Результат надреза:

People count 1 
    People count 2 

Result of Code

Может кто-то пожалуйста скажите мне, как получить свойства формируют запрос. Результат.

+0

Этот код должен работать нормально. Вы можете запустить запрос непосредственно в веб-браузере (http: // localhost: 7474) и посмотреть, будут ли данные в вашем БД выглядеть иначе? –

+0

Уважаемый @TathamOddie, Да, я выполнил запрос с Cypher: «MATCH (a) - [: LOVE] - (b) RETURN a.name, b.name» и увидел 2 узла с отношениями LOVE. Я использую Neo4j 2.0 RC1. ОС win7-64 NET Framework 4.5. – hoanganh17b

+0

Можете ли вы изменить свое «Имя» на свойство, поэтому оно должно читать 'public string name {get; set;}' Я считаю, что Json.NET нуждается в свойствах, а не для членов ... –

ответ

3

Это является из-за определения класса Person, JSON.Net не может десериализоваться для членов и требует свойств. Вы можете проверить это, выполнив следующий код:

public class Person { public string Name { get;set;} } 
public class PersonWithMembers { public string Name; } 

В основном одинаковые классы, один со свойством, один с членом.

//Stick this in the Main method 
var pA = new Person {Name = "PersonA", Twitter = "tA"}; 
var pB = new Person {Name = "PersonB", Twitter = "tB"}; 

gc.Cypher.Create("(p:Person {person})").WithParam("person", pA).ExecuteWithoutResults(); 
gc.Cypher.Create("(p:Person {person})").WithParam("person", pB).ExecuteWithoutResults(); 

Console.WriteLine("Members:"); 
var membersQuery = gc.Cypher 
    .Match("(p:Person)") 
    .Return(p => p.As<PersonWithMembers>()); 

foreach (var p in membersQuery.Results) 
    Console.WriteLine(p.Name); 

Console.WriteLine("Properties:"); 
var propertiesQuery = gc.Cypher 
    .Match("(p:Person)") 
    .Return(p => p.As<Person>()); 

foreach (var p in propertiesQuery.Results) 
    Console.WriteLine(p.Name); 

Вы должны получить вывод:

Members: 


Properties: 
PersonA 
PersonB 
+0

Большое спасибо @ Крис Скардон. ..и работает для меня отлично .. – hoanganh17b

+1

Ах. Хороший улов! Я так редко использую публичные поля для чего-либо, поэтому это даже не перешло мне в голову. Это произошло раньше. Если он снова появится, я могу добавить «эй, у вас есть 0 свойств этого типа, вы хотите снова написать этот код?» исключение. –

+0

Хех, это было бы отличным исключением, чтобы увидеть всплывающие окна :) –