如何使用参数通过graphql将动态字符串数组存储为neo4j中的节点属性?

时间:2018-02-07 09:07:47

标签: arrays node.js neo4j graphql

我正在使用Neo4j(3.2.3)和graphql。我试图通过graphql在用户的单个属性中添加多个电话号码(动态)作为字符串数组。因此,用户可以拥有与他/她想要添加的电话号码一样多的电话号码。  例如,

 User{
       "name": "Neo",
       "Job": "Actor",
       "phoneNumber": [
                       "13274564",
                       "23451674",
                       "56454646"
                      ]
        }

但我无法得到理想的结果。有人可以让我知道我做错了什么吗?

这是我的用户的graphql typeschema和变异查询:

    type User{

     name:String
     Job:String
     phoneNumber: [String]
    }


   type Mutation {

    addUser(
      name:String!
      Job:String
      phoneNumber: [String]       
    ): User 
   }

这是我对解析器的密码查询:

addUser(_, params) {


  let query = `MERGE(u:User {_id:apoc.create.uuid()})
              ON CREATE SET u.name= {name},
                            u.Job= {Job},
                            u.phoneNumber = ["{{phoneNumber},{phoneNumber}}"]

当我通过GraphiQL运行此查询添加所需的电话号码时,数字没有被更新,而且数据库中的相同文本phoneNumber正在更新,如下所示:

error in updating the field

那么,有人可以帮帮我吗?我也经历了apoc程序,但仍然无法弄清楚如何为这种情况编写适当的密码查询。

1 个答案:

答案 0 :(得分:1)

由于您为phoneNumber参数传递了一个字符串数组,因此您只需将用户节点上的phoneNumber属性设置为phoneNumber参数:

MERGE(u:User {_id:apoc.create.uuid()})
  ON CREATE SET u.name= {name},
                u.Job= {Job},
                u.phoneNumber = {phoneNumber}

如果您想处理电话号码更新(保留以前的号码):

MERGE(u:User {_id:apoc.create.uuid()})
ON CREATE SET u.name= {name},
              u.Job= {Job}
WITH *
UNWIND {phoneNumber} AS phone
SET u.phoneNumber = coalesce(u.phoneNumber + phone, [phone]) 

使用图表数据模型的更典型方法是将每个电话号码建模为节点,并将电话号码节点连接到用户节点:

MERGE(u:User {_id:apoc.create.uuid()})
ON CREATE SET u.name= {name},
              u.Job= {Job}
WITH *
UNWIND {phoneNumber} AS phone
MERGE (p:PhoneNumber {number: phone}
MERGE (u)-[:HAS_PHONE_NUMBER]->(p) 

这会稍微改变您的GraphQL架构,如下所示:

type User {
  name: String
  job: String
  phoneNumber: [PhoneNumber]
}

type PhoneNumber {
  number: String
}

另外请务必查看可以从GraphQL架构中驱动Neo4j数据模型的neo4j-graphql integrations并自动生成解析器。