Neo4j:将节点与具有相同名称的特定节点相关

时间:2020-03-07 17:36:53

标签: neo4j graphql grandstack

我有美国所有州和城镇的清单。各州可以使用相同的城镇名称,因此我正在检查以确保每个城镇都与其受尊重的州相连。

我有与某个城镇相关的事件,但是问题是我的事件与不同州的多个城镇相关。如何将我的新活动与某个州的城镇联系起来? 这是我的架构。

type State {
  stateName: String!
  stateAbbreviation: String!
  towns: [Town] @relation(name: "STATE_OUT", direction: "OUT")
}

type Town {
  state: String!
  name: String!
  events: [CraftShowEvent]
}

type Event {
  name: String!
  day: String!
  month: String!
  time: String!
  town: String!
  state: String!
}

2 个答案:

答案 0 :(得分:0)

在创建图形数据库时,请确保在"Town"节点和"Event"节点之间具有此数据模型

EVENT -> [] -> Town
WHERE 
  EVENT.town = Town.Name 
AND
  EVENT.state = Town.state

答案 1 :(得分:0)

我只是想更新我的问题,以防其他人遇到。我正在使用neo4j和graphql,它们根据我的graphql模式自动生成查询和变异。

相反,我进行了修改并使用了@cypher指令。我需要更好地控制如何保存数据。

type Mutation {
  setBatchTown(listOfTowns: [BatchTown]): Town
    @cypher(statement:"""
      UNWIND $listOfTowns AS el
      MERGE (t:Town {name: el.name, state: el.state})
      WITH t
      MATCH (s:State)
      WHERE t.state = s.name
      CREATE (t)-[:STATE_OUT]->(s)
    """)

  setEvent(event: InputEvent): Event
    @cypher(statement:"""
      MERGE (e:Event { name: $event.name, day: $event.day, month: $event.month, time: $event.time, town: $event.town, state: $event.state })
      WITH e
      MATCH (s:State), (t:Town {name: e.town, state: e.state})
      WHERE e.state = s.name AND e.town = t.name
      MERGE (e)-[:TOWN_OF]->(t)
      RETURN t
    """)
 }

然后,当我发出请求时,我可以做这样的事情。

        client.mutate({ variables: { 
            listOfTowns: [{
              name: 'town1'
              state: 'VA'
            },
            {
              name: 'town2'
              state: 'WA'
            }] 
        }, mutation: CREATE_STATE_MUTATION })
          .then(() => resolve())
          .catch(err => reject(err))
        })