我有这个代码,这很好,但正如您将看到的那样,它会为项目的每个视图添加一个新的关系。
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之后运行它,这让我弄得一团糟,但我离题了..
问题在于我从不同版本的客户端和不同版本的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();
完美:)
答案 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()