使用timestamp()作为值时更新关系属性

时间:2015-07-06 19:47:29

标签: c# neo4j neo4jclient

我有这个代码,这很好,但正如您将看到的那样,它会为项目的每个视图添加一个新的关系。

return client.Cypher
            .Match("(p:Person)", "(s:Store)")
            .Where((Person p) => p.Email == username)
            .AndWhere((Store s) => s.Name == store)
            .Merge("(product:Product { pId: {pId} })")
            .OnCreate()
            .Set("product = {newProduct}")
            .WithParams(new
            {
                pId = newProduct.pId,
                newProduct
            })
            .CreateUnique("product-[:STOCK_FROM]->s")
            .CreateUnique("(p)-[b:BROWSED{timestamp:timestamp()}]->(s)")
            .CreateUnique("(p)-[v:VIEWED{timestamp:timestamp()}]->(product)")
            .Return<Product>("product").Results.ToList();

现在理想情况下我想添加一个名为total的第二个属性,它将是一个int。每次访问都会增加此属性,并将时间戳更新为“lastviewed”,如:

            .Create("(p)-[b:BROWSED{lastviewed:timestamp(),total:1}]->(s)")
            .Create("(p)-[v:VIEWED{lastviewed:timestamp(),total:1}]->

但我不确定两件事......  1.如何查询关系是否已经存在,我认为这将是这样的:

.Match("(p:Person)-[:BROWSED]-(product)")
            .Where((Person p) => p.Email == username)

但是我遇到了一个关于需要使用.With()的错误,如果我在.OnCreate之后运行它,这让我弄得一团糟,但我离题了..

  1. 查询后,如何增加总属性的数据值?
  2. 问题在于我从不同版本的客户端和不同版本的Neo4j中看到了答案,我在2.2.3上使用最新客户端(今天下载)。

    有人请帮忙! :)

    无法在评论中填写此内容,因此我将在此处更新:

    return client.Cypher
                .Match("(p:Person)", "(s:Store)")
                .Where((Person p) => p.Email == username)
                .AndWhere((Store s) => s.SearchIndex == store)
                .Merge("(product:Product { ASIN: {ASIN} })")
                .OnCreate()
                .Set("product = {newProduct}")
                .WithParams(new
                {
                    ASIN = newProduct.ASIN,
                    newProduct
                })
                .CreateUnique("product-[:STOCK_FROM]->s")
                .Merge("(p)-[b:BROWSED]->(s)")
                .OnCreate()
                .Set("b.lastviewed=timestamp(), b.total=1")
                .OnMatch()
                .Set("b.lastviewed=timestamp(), b.total=b.total+1")
                .Return<Product>("product").Results.ToList();
    

    完美:)

1 个答案:

答案 0 :(得分:1)

我会将MERGE用于ON CREATE SET和`ON MATCH SET``

MERGE (p)-[b:BROWSED]->(s)
ON CREATE SET b.total = 1
ON MATCH SET b.lastviewed=timestamp(), b.total=b.total+1

不确定在Neo4jClient中MERGE支持有多好

或者如果你想继续使用CREATE

CREATE UNIQUE (p)-[b:BROWSED]->(s)
SET b.total = coalesce(b.total,1)+1, b.lastviewed=timestamp()