Neo4j: привязка узла к указанному узлу c с тем же именем - PullRequest
0 голосов
/ 07 марта 2020

У меня есть список всех штатов и городов США. У штатов могут быть одинаковые названия городов, поэтому я проверяю, чтобы убедиться, что каждый город связан с их уважаемым государством.

У меня есть события, связанные с городом, но проблема в том, что мои события связаны с несколькими городами в разных штатах. Как я могу связать свое новое мероприятие с городом в определенном штате? Это моя схема.

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 голосов
/ 14 марта 2020

Я просто хотел обновить свой вопрос на случай, если кто-нибудь еще столкнется с этим. Я использовал 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))
        })
0 голосов
/ 07 марта 2020

при создании базы данных графа убедитесь, что эта модель данных находится между узлом "Town" и "Event" узлом

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