如何在用于创建新节点(Neo4j)的 graphql 解析器中添加验证也分配现有关系?

How to add validation in graphql resolver used to create a new node(Neo4j) assigning an existing relationship too?

在我的 neo4j(3.2 版本)中,我已经有了标签 "Player"、"Team" 和 "Position" 的节点。它们之间的关系是:

(p:Player)-[:Currently_In]->(t:Team), (p:Player)-[:In_Position]->(a :位置)

现在,我想向现有团队添加一名新球员以获得新职位(使用 graphql 解析器)。但是,如果职位已经存在,则不应添加他。

例如我的 DB 已经有 "Messi" (p:Player) 在 "Barca" (t:Team) 和位置 "Central Forward"。所以,现在如果我想添加任何新玩家 "John"在同一球队"Barca"的位置"Central Forward",他不应该被添加。

如何在 graphql 解析器中实现这一点?

这是我的架构示例:

//Schema.js
AddPlayer(label: String!,  PlayerID: String, TeamID: String, PositionID: String): Player

这是解析器示例:

AddPlayer(_, args) {
  let session = driver.session();

        var query = `
                            MERGE(p:Player{PlayerID: $PlayerID })
                            MERGE(t:Team{TeamID: $TeamID})
                            MERGE(a:Position{PositionID: $PositionID})

                            MERGE(p)-[:Currently_In]->(t)  
                            MERGE(p)-[:In_Position]->(a)  


                               ON create set p.label={label}
                          RETURN p;`

  return session.run(query, args)
    .then(result => {
      return result.records[0].get("p").properties
    })
}

我找不到任何有助于通过 graphql 或 neo4j 进行验证的内容。任何帮助,将不胜感激。

您需要简单的测试:

MERGE(t:Team{TeamID: $TeamID})
MERGE(a:Position{PositionID: $PositionID})
WITH t, a
OPTIONAL MATCH (a)<-[:In_Position]-(PT:Player)-[:Currently_In]->(t)
WITH a, t, count(PT) as playersCount
     WHERE playersCount <= 3
       MERGE(p:Player{PlayerID: $PlayerID })
       MERGE(p)-[:Currently_In]->(t) ON create set p.label={label} 
       MERGE(p)-[:In_Position]->(a)  
RETURN p;