使用Neo4jClient

时间:2016-04-25 15:49:02

标签: c# asp.net neo4j cypher neo4jclient

我正在尝试使用Neo4jClient在.Net中使用Neo4j。我试图找到填充以下具体C#类的最佳方法:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

public class PersonData
{
    public Person Person { get; set; }
    public List<Relation> Relations { get; set; }
    public List<string> Labels { get; set; }
}

public class Relation
{
    public Person Relative {get; set;}
    public string Relationship { get; set; }
}

我目前有以下基本图表模型:

(p:Person{ id: 1, name: 'Fred', age: 42})-[r:PARENT_OF]->(c:Person{ id: 2, name: 'Sarah', age: 8})

还有其他关系类型,例如MARRIED_TO。

我目前有以下查询,我想得到一个特定的人节点,它的关系(即相关人员节点和关系类型的字符串,可以是关系类型或者是关系),填充PersonData。我现在可以很容易地填充Person,但我不知道如何填充关系。

var data = client.Cypher
            .Match("(p:Person)-[r*1..1]->(per:Person)")
            .Where((Person p) => p.Id == 3)
            .Return((p, per) => new PersonData
            {
                Person = p.As<Person>()
            })
            .Results;

PersonData的数量是我在查询之外必须做的事情,还是可以在return语句中完成?

我还有一个问题,即此查询返回id为3的节点两次,我不知道为什么。

非常感谢。

1 个答案:

答案 0 :(得分:1)

这适用于您的课程 - 只要您从List<Person>更改为IEnumerable

var query = gc.Cypher.Match("(p:Person {Id:2})")
        .OptionalMatch("(p)-[r]->(p2:Person)")
        .With("p, {Relationship: type(r), Relative: p2} as relations")
        .Return((p, relations) => new PersonData
        {
            Person = p.As<Person>(),
            Relations = relations.CollectAs<Relation>()
        });