Одна из самых полезных функций интеграции GRANDstack с GraphQL - это возможность создавать и выражать направленные отношения между узлами на вашем графике или объектами в ваших данных. Простым примером могут быть два друга, которые вы могли бы выразить в своей схеме GraphQL следующим образом:

type Person { name: String friends: [Person] @relation(name: "FRIEND", direction: "OUT) }

Вы можете легко расширить эту простую схему и добавить любое количество отношений, которые вам нравятся; любимые рестораны, тусовки, рабочие места, семья и т. д. Кроме того, если вы хотите поместить свойства в отношения, вы также можете сделать это, сделав само отношение типом в своей схеме, допустим, вы хотите отслеживать историю работы людей :

type Workplace { 
name: String 
address: String
 pastEmployees: [Person] @relation(name: "WORKED_AT", direction: "IN")
 currentEmployees: [Person] @relation(name: "WORKS_AT", direction: "IN") }
type WorkedAt 
@relation(name: "WORKED_AT")
{ startDate: Date
 endDate: Date
 startSalary: Float
 endSalary: Float
 }

Затем вы расширяете свой тип человека:

type Person { 
name: String
 worksAt: WorkPlace @ relation(name: "WORKS_AT", direction: "OUT")
 workedAt: [WorkPlace] @relation(name: "WORKED_AT", direction: "OUT") 
}

Это дает вам возможность легко создавать полную историю работы для вашего человека и позволяет отслеживать текущих и прошлых сотрудников вашего рабочего места. Связи между ними дают вам возможность глубоко погрузиться в историю обоих. Что, если бы вы хотели узнать среднюю конечную зарплату вашего сотрудника за всю жизнь? Поскольку вы используете GRANDstack, у вас есть доступ к директивам Cypher через Neo4j:

type Person { 
name: String
worksAt: WorkPlace @ relation(name: "WORKS_AT", direction: "OUT") workedAt: [WorkPlace] @relation(name: "WORKED_AT", direction: "OUT") avgEndingSalary: Float @cypher ( statement: "MATCH (this)-[r:WORKED_AT]->(:WorkPlace) return avg(r.endSalary) 
}

Вы можете увидеть, как эта возможность запрашивать отношения и их свойства позволяет добавить в ваше приложение глубину и детализацию. Вам не нужно останавливаться на достигнутом: с указанными датами вы можете отслеживать среднее время, потраченное на каждую работу, или получить точное количество дней, в течение которых человек где-то работал, количество деталей, которые вы теперь можете извлечь из этих данных, только растет. Направленный характер набора взаимосвязей также позволяет вам контролировать поток информации, и вы можете начать использовать алгоритмы графиков, чтобы понять смысл ваших данных. Хотите найти кратчайший путь между двумя компаниями через бывших или нынешних сотрудников? Для этого есть графический алгоритм! Хотите найти человека, который может стать мостом между двумя компаниями? Для этого тоже есть графический алгоритм! Возможность создавать и отслеживать эти многочисленные отношения и их свойства - лишь одна из причин того, что GraphQL и Neo4j с GRANDstack идеально подходят для небес.

Первоначально опубликовано на https://dev.to 5 января 2020 г.