我正在使用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正在更新,如下所示:
那么,有人可以帮帮我吗?我也经历了apoc程序,但仍然无法弄清楚如何为这种情况编写适当的密码查询。
答案 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并自动生成解析器。