我正在尝试设置一些数据,这对于cypher查询来说还是比较新的。我正在做一个项目,节点和关系是作为足球队的一部分创建的。
例如,我现在只在游戏和裁判上创建节点。我的逻辑是我读取游戏的数据,如果裁判不作为节点存在,则创建他/她。如果在未来的比赛中我看到一个已经存在的裁判,我只是将它们与游戏联系起来而不是创建一个重复的记录。我正在做以下事情,并希望在我尝试填充数据之前看看我的逻辑是否有意义。
//JUST CREATED A GAME NODE called $GameNode
//let's search if the referee exists
$queryString = "START n=node({nodeId}) ".
"MATCH (n)<-[:REFEREED]-(x)".
"WHERE x.name = {name}".
"RETURN x";
$query = new Everyman\Neo4j\Cypher\Query($client, $queryString, array('nodeId' => 0, 'name' => $referee['referee_name']));
$result = $query->getResultSet();
$referee = 0;
if (count($result)==0)
{
//create referee as he/she does not exist
$referee= $client->makeNode();
$referee->setProperty('name', $referee['referee_name'])
->save();
}
else
{
//let's point the referee to this law case also
$referee = $client->getNode($result['x']->getProperty('id'));
}
$referee->relateTo($GameNode, 'REFEREED')
->save();
非常感谢提前
答案 0 :(得分:1)
这应该有效,但会进行很多往返。
您只能将Cypher用于此任务:
Neo4j 1.9使用CREATE UNIQUE
START root=node({nodeId})
CREATE UNIQUE (root)<-[:REFEREED]-(referee {name: {name}})
RETURN referee
在Neo4j 2.0中,您可以使用MERGE
MERGE (referee:Referee {name: {name}})
RETURN referee
请为您的标识符使用更好的名称。