Создайте уникальный индекс в коллекции ребер ArangoDB для нескольких атрибутов пути, включая атрибуты _from и _to.

Я пытаюсь установить уникальное ограничение для коллекции ребер, чтобы между двумя заданными узлами можно было создать только одно ребро определенного типа. Проблема в том, что я не могу использовать атрибуты _from и _to в качестве атрибутов пути при создании индекса. Что я пробовал до сих пор:

db._collection('edges').ensureUniqueConstraint('_from', '_to', 'type');

Я получаю следующую ошибку:

[ArangoError 10: bad parameter]

Я не хочу проверять, существует ли определенный тип ребра между двумя узлами перед его созданием.

Любые подсказки?


person jarandaf    schedule 31.07.2014    source источник


Ответы (2)


В настоящее время невозможно создать вторичные индексы для внутренних атрибутов, таких как _key, _id, _rev, _from или _to. Мы хотим разрешить это для будущей версии ArangoDB, но это будет серьезное изменение кода.

Единственный способ добиться желаемого результата — создать дополнительный атрибут в сохраняемом ребре и поместить в него комбинацию «_from», «_to» и «type». Я думаю, что эти значения должны быть известны уже при создании ребра.

Поэтому вместо того, чтобы сохранять край, подобный этому

db.edges.save(_from, _to, { type: type, other: ... });

это должно быть так:

// create a unique index on attribute "unique"
db._collection("edges").ensureUniqueConstraint("unique");

// create a variable "unique" which contains the values of _from and _to and type
var unique = _from + "-" + _to + "-" + String(type);

// now save the edge, using the "unique" attribute
db.edges.save(_from, _to, { type: type, unique: unique, other: ... });

Это обходной путь, но он должен решить эту конкретную проблему.

person stj    schedule 01.08.2014
comment
Спасибо, что указали на это (хотел убедиться, что эта функция еще не доступна). Это должно сработать, спасибо! - person jarandaf; 01.08.2014

Начиная с ArangoDB 3.0 вы можете обеспечить уникальность отношений в коллекциях ребер с помощью уникального хеш-индекса в полях _from и _to.

db.edgeCollectionName.ensureIndex({ type: "hash", fields: [ "_from", "_to" ], unique: true });

Когда существует отношение A->B, другое A->B не будет создано. Тем не менее, B->A по-прежнему можно создать.

person mrkvon    schedule 24.03.2017
comment
И вы всегда можете отсортировать A и B перед созданием хэша, чтобы он работал как для A-›B, так и для B-›A. - person William; 12.09.2018