Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graph 将节点添加到cypher中给定节点之后的链表中_Graph_Neo4j_Cypher - Fatal编程技术网

Graph 将节点添加到cypher中给定节点之后的链表中

Graph 将节点添加到cypher中给定节点之后的链表中,graph,neo4j,cypher,Graph,Neo4j,Cypher,我有以下图表: (Boxer)-[:STARTS]->(Round)-[:CONTINUES]->(Round)-[:CONTINUES]->(Round)-[:CONTINUES]->(Round) 我想在名为prevRound的指定回合之后插入新回合。现在,我正在这样做: MERGE (round:Round {uuid: $round.uuid}) MERGE (prevRound:Round {uuid: $prevRound.uuid}) MERGE (pre

我有以下图表:

(Boxer)-[:STARTS]->(Round)-[:CONTINUES]->(Round)-[:CONTINUES]->(Round)-[:CONTINUES]->(Round)
我想在名为prevRound的指定回合之后插入新回合。现在,我正在这样做:

MERGE (round:Round {uuid: $round.uuid})
MERGE (prevRound:Round {uuid: $prevRound.uuid})
MERGE (prevRound)-[oldRel:CONTINUES]->(nextRound)
MERGE (prevRound)-[:CONTINUES]->(round)-[:CONTINUES]->(nextRound)
DELETE oldRel
这是可行的,但当我尝试在列表末尾插入节点时,它实际上会创建一个空节点。我知道这是因为:

MERGE (prevRound)-[oldRel:CONTINUES]->(nextRound)
实际上,这将在不存在下一个节点时创建下一个节点

我怎样才能防止呢?
我尝试使用可选匹配,但效果不好。

这里使用MERGE子句并不合适,因为正如您所看到的,如果不存在模式,它将创建模式,为您提供一个空白节点以及与它的关系。OPTIONAL MATCH是用于该行的正确子句,尽管您确实需要在它和前面的合并之间使用WITH子句……但更好的方法实际上是稍微重新排列查询,请参见最后一段

您还应该拆分最后一次合并,因为像这样的较长模式在某些情况下可能不会达到您期望的效果。阅读我们的知识库文章,了解一些可能会让您绊倒的细节

实际上,我们只需重新安排部分查询,就可以完成您想要的任务

MERGE (round:Round {uuid: $round.uuid})
MERGE (prevRound:Round {uuid: $prevRound.uuid})
WITH round, prevRound
OPTIONAL MATCH (prevRound)-[oldRel:CONTINUES]->(nextRound)
DELETE oldRel
MERGE (prevRound)-[:CONTINUES]->(round)
WITH round, nextRound, oldRel
WHERE nextRound IS NOT NULL
MERGE (round)-[:CONTINUES]->(nextRound)
我们通过前面的WHERE子句保护round和NEXTROND之间的合并,该子句过滤掉NEXTROND不存在的任何行

一种可能更简单的方法是先处理已知存在的节点,round和prevRound,然后处理可能存在或可能不存在的模式,即与旧节点的匹配,尽管您需要进行一些过滤,因为匹配也会选择您刚刚创建的关系进行取整:

MERGE (round:Round {uuid: $round.uuid})
MERGE (prevRound:Round {uuid: $prevRound.uuid})
MERGE (prevRound)-[:CONTINUES]->(round)
WITH round, prevRound
MATCH (prevRound)-[oldRel:CONTINUES]->(nextRound)
WHERE nextRound <> round
DELETE oldRel
MERGE (round)-[:CONTINUES]->(nextRound)

你也可以考虑是否有任何地方你知道这种关系是不存在的,如果是的话,使用创建而不是合并。我觉得这里的最后一次合并可能是一次创建。

谢谢,这很有意义