将临时属性添加到Neo4j Cypher中的节点以进行返回

时间:2016-08-19 08:06:58

标签: neo4j cypher neo4jclient

我正在使用Neo4j .Net客户端与Neo4j数据库连接。

在尝试将相关节点映射到嵌套类时,我经常遇到此问题:

例如映射

(:Foo)-[:FOOBAR]->(:Bar)

到表格

public class Foo {
    public string FooPropOne { get; set; }
    public string FooPropTwo { get; set; }
    public List<Bar> Bars { get; set; }  
}

public class Bar {
    public string BarPropOne { get; set; }
    public string BarPropTwo { get; set; }
}

要获得正确的反序列化输出,我必须像这样编写查询:

Foo foo = WebApiConfig.GraphClient.Cypher
    .Match("(f:Foo)-[:FOOBAR]->(b:Bar)")
    .With("@{
                FooPropOne: f.FooPropOne,
                FooPropTwo: f.FooPropTwo,
                Bars: collect(b)
             } AS Result")
    .Return<Foo>("Result")
    .SingleOrDefault();

在某种程度上,这很好,并且工作得很好,但是Foo类具有的属性越来越笨重。

我想知道在返回节点时是否可以在“With”语句中添加临时属性(在上面的情况下为“Bars”),这不需要我在每个属性上写入父节点?

这样的东西
.With("f.Bars = collect(b)")
.Return<Foo>("f")

实际上不会影响存储在数据库中的数据吗?

提前感谢任何重拍!!

1 个答案:

答案 0 :(得分:2)

我不知道如何添加一个像你想要的临时财产,个人 - 我会采取两种方法中的一种,而这个决定实际上取决于你喜欢做什么。

选项1

选择属性版本

var foo = client.Cypher
    .Match("(f:Foo)-[:FOOBAR]->(b:Bar)")
    .With("f, collect(b) as bars")
    .Return((f, bars) => new Foo
    {
        FooPropOne = f.As<Foo>().FooPropOne,
        FooPropTwo = f.As<Foo>().FooPropTwo,
        Bars = Return.As<List<Bar>>("bars")
    }).Results.SingleOrDefault();

此版本允许您使用您带出的对象进行“安全输入”,这在具有大量属性的类中确实会限制拼写错误的可能性。这将为您提供{{1}实例,所以不需要做任何其他处理。

选项2

一点点后处理所需的版本

Foo

这节省了输入属性,因此在大型课程中节省了时间,并且还意味着如果添加额外的属性,则不需要记住更新查询。 然而您确实需要进行一些查询后处理,例如:

var notQuiteFoo = client.Cypher
    .Match("(f:Foo)-[:FOOBAR]->(b:Bar)")
    .With("f, collect(b) as bars")
    .Return((f, bars) => new
    {
        Foo = f.As<Foo>(),
        Bars = bars.As<List<Bar>>()
    }).Results;

就个人而言 - 我喜欢选项2 ,因为它对Typos的潜力较小,但我并不欣赏你所追求的。