【问题标题】:How to store dynamic array of strings as node property in neo4j using parameter via graphql?如何通过graphql使用参数将动态字符串数组存储为neo4j中的节点属性?
【发布时间】:2018-02-07 22:11:46
【问题描述】:

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

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

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

这是我对用户的 graphql 类型模式和变异查询:

    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 程序,但仍然无法弄清楚如何为这种情况编写适当的密码查询。

【问题讨论】:

    标签: arrays node.js neo4j graphql


    【解决方案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
    }
    

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

    【讨论】:

    • 你永远是我密码的救星。非常感谢您的努力以及您的文章和演讲。一个简单的问题,如果我必须处理 2 个不同的字段作为字符串数组,例如 phoneNumber 和 email(保留以前的数据),我该怎么办?我接受答案。再次感谢!
    • 很高兴这很有帮助 :-) 两个数组是相似的 - 您也只需遍历电子邮件地址。
    • 再次感谢 :)... 真的很棒..我会尝试按照您提到的进行迭代。是的,作为 neo4j 的铁杆粉丝和用户,我肯定会在未来几天内查看 neo4j-graphql 集成..!!很高兴能得到我钦佩的人的回应:) 祝你有 gr8 的一天!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多