Неоизм связан, если отношения не существуют
Я только начал использовать неоизм и наслаждался им до сих пор. Я натолкнулся на небольшую проблему и задумался, виновата ли в этом моя наивность, связанная с неоизмом или самим неоизмом.
У меня есть строка в моем коде Go:
agent.Relate(relation, node.Id() , neoism.Props{})
Проблема в том, что, если я запустлю его несколько раз, это дублирует отношения. Есть ли способ создать, только если связь еще не существует - что-то похожее на GetOrCreateNodeFunction.
Или мне придется написать какой-нибудь необработанный cql, чтобы проверить, существует ли связь, прежде чем выполнять приведенный выше оператор?
заранее спасибо
2 ответа
Не существует встроенной функции или конечной точки REST для создания уникальных направленных отношений. Вы можете назначить уникальное значение свойства каждому отношению и добавить уникальный индекс к свойству отношения, или вы можете использовать запрос шифрования и предложение CREATE UNIQUE.
Вы можете использовать следующую функцию, которую я использую для моего кода. Он имеет внешнюю зависимость в
github.com/imdario/mergo
И следующая универсальная функция будет работать для любого типа узла и отношений.
func GetOrCreateRelationship(from *neoism.Node, to *neoism.Node, relType string, props neoism.Props) (relationship *neoism.Relationship) {
relationships, err := from.Relationships(relType)
if err == nil {
for _, relationship := range relationships {
endNode, err := relationship.End()
if err != nil {
continue
}
if endNode.Id() == to.Id() {
newProps, err := relationship.Properties()
if err != nil {
return relationship
}
if err := mergo.Merge(&newProps, props); err != nil {
relationship.SetProperties(newProps)
}
return relationship
}
}
}
relationship, err = from.Relate(relType, to.Id(), props)
if err != nil {
log.Printf("Cannot create relationship: %s", err)
}
return
}