В Gremlin / Tinkerpop я хочу выполнить версионное обновление на вершине. Если существует существующая вершина, я хочу изменить ее только в том случае, если версия соответствует свойству номера версии.
Ниже приведен код, который пытается сделать это с помощью gremlinjs
. Не удается создать вершину, более поздний запрос не может ее найти.
(в предыдущей версии была ошибка компиляции, но это была проблема с недокументированным синтаксисом javscriptism)
[ОБНОВЛЕНИЕ] см. Комментарии в ответе о том, что было не так. Рабочая версия на https://gist.github.com/pszabop/3b07fa7caadf1dbd86953a713ed96ce0
//
// o.id o.__version, and o.__lastUpdate have special meaning or are reserved
//
graphdb.upsertVertexVersioned = async function(type, o) {
const g = traversal().withRemote(this.connection);
let oldVersion;
if (!o.id) {
o.id = uuidv4();
}
if (!o.__version) {
o.__version = 0;
oldVersion = 0;
} else {
oldVersion = o.__version;
o.__version++;
}
o.__lastUpdate = Date.now();
// @see http://tinkerpop.apache.org/docs/current/recipes/#element-existence
// The pattern we are using is keys get copied into properties that can be used
// by the graph database for its work, and then the
// entire object is JSON serialized into a generic `obj` property.
// XXX TBD use graphson?
const v1 = await g.V().has(type, 'id', o.id)
.fold()
.coalesce(__.unfold(),
__.addV(type).property('id', o.id)
.property('version', o.__version)
).choose(__.values('version').is(oldVersion),
__.in_()
.property('lastUpdate', o.__lastUpdate) // updated properties go here
.property('version', o.__version) // updated properties go here
.property('obj', JSON.stringify(o)), // updated properties go here
__.out()
).next();
return o;
};
Использованная литература:
- Общие сведения о различных методах добавления ребер с помощью Gremlin-Python
- http://tinkerpop.apache.org/docs/current/recipes/
Версии
- janusgraph / janusgraph: последний
- gremlinjs 3.4.4