C# 代码:
public void AddMarketInfo(MarketInfo mi)
{
Bid bid = mi.Bid;
Ask ask = mi.Ask;
var query = clientConnection.Cypher
.Merge("(newbid:Bid { ID: {bID} })")
.OnCreate()
.Set("newbid = {bid}")
.WithParams(new
{
bID = bid.ID,
bid
})
.Merge("(newask:Ask { ID: {aID} })")
.OnCreate()
.Set("newask = {ask}")
.WithParams(new
{
aID = ask.ID,
ask
})
.Merge("(newMarketInfo:MarketInfo { ID: {id}, ASK: {askID}, BID: {bidID} })")
.OnCreate()
.Set("newMarketInfo = {mi}")
.WithParams(new
{
id = mi.ID,
bidID = bid.ID,
askID = ask.ID,
mi
})
.CreateUnique("(newask)-[rA:Ask_Input_Data]->(newMarketInfo)")
.CreateUnique("(newbid)-[rB:Bid_Input_Data]->(newMarketInfo)");
query.ExecuteWithoutResults();
}
我目前正在调试程序,因此该语句正在同一数据上执行多次。是的,我现在要进入数据库并删除所有节点。
当创建“Bid”节点和“Ask”节点时,它成功地与现有节点合并,但“MarketInfo”节点被复制了。
你有什么想法吗?
编辑2:修改查询
所以我在阅读neo4j文档:
https://neo4j.com/docs/developer-manual/current/cypher/clauses/merge/#query-merge-on-create-on-match
他们提供的例子是:
使用ON CREATE和ON MATCH合并节点并设置属性,如果需要创建节点则进行操作。
查询。
MERGE (keanu:Person { name: 'Keanu Reeves' })
ON CREATE SET keanu.created = timestamp()
ON MATCH SET keanu.lastSeen = timestamp()
RETURN keanu.name, keanu.created, keanu.lastSeen
查询创建了一个名为'keanu'的节点,并在创建时设置了时间戳。如果'keanu'已经存在,则会设置不同的属性。
因此,我修改了我的代码以“执行相同的操作”:
var query = graphClient.Cypher
.Merge("(newbid:Bid { ID: {bID} })")
.OnMatch()
.Set("newbid = {bid}")
.OnCreate()
.Set("newbid = {bid}")
.WithParams(new
{
bID = bid.ID,
bid
})
.Merge("(newask:Ask { ID: {aID} })")
.OnMatch()
.Set("newask = {ask}")
.OnCreate()
.Set("newask = {ask}")
.WithParams(new
{
aID = ask.ID,
ask
})
.Merge("(newMarketInfo:MarketInfo { ID: {id}, ASK: {askID}, BID: {bidID} })")
.OnCreate()
.Set("newMarketInfo = {mi}")
.WithParams(new
{
id = mi.ID,
bidID = bid.ID,
askID = ask.ID,
mi
})
.Merge("(newask)-[rA:Ask_Input_Data]->(newMarketInfo)")
.Merge("(newbid)-[rB:Bid_Input_Data]->(newMarketInfo)");
query.ExecuteWithoutResultsAsync();
然而,MarketInfo节点仍在被复制。我认为现在我走在了正确的道路上,但是......还有一些东西我没有理解。
mi.ID
、bid.ID
和ask.ID
在所有执行中都是相同的,对吗? - Bruno Peres(:MarketInfo { ID: 1, ASK: 2, BID: 3})
(具有相同的三个属性值),那么每次都会创建一个新节点(这是不应该发生的)吗?还是你是在说每次这三个值都有所变化(这应该导致每次都创建一个新节点)? - cybersammi
对象。 - cybersam