5

我正在尝试为边缘集合设置唯一约束,以便在两个给定节点之间只能创建某种类型的边缘。问题是在创建索引时似乎我不能使用_from_to属性作为路径属性。到目前为止我已经尝试过:

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

我收到以下错误:

[ArangoError 10: bad parameter]

我不想在创建它之前检查两个节点之间是否存在某种边缘类型。

有什么提示吗?

4

2 回答 2

5

目前无法在 _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: ... });

这是一种解决方法,但它应该可以解决该特定问题。

于 2014-08-01T09:53:41.767 回答
5

从 ArangoDB 3.0 开始,您可以使用和字段上的唯一哈希索引来确保边缘集合中关系的唯一性。_from_to

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

当存在A->B关系时,不会创建另一个A->B 。但是,仍然可以创建B->A 。

于 2017-03-24T18:30:17.803 回答