Как добавить значение к свойству вершины, используйте только gremlin api - PullRequest
2 голосов
/ 07 февраля 2020

Я получил график с вершинами, и мне нужно обновить свойство вершины, записав некоторую строку в конец старого значения (добавить значение в конец старого свойства)

Также мне нужно сделать это только by gemlin api?

Мне нужно использовать только api, потому что я отправляю свой запрос другому серверу, где он будет выполняться

Так, например, если мой вопрос будет "установить значение, если это не представляет "- я знаю, как это сделать

traversal.coalesce(__.has(key), __.property(key, value));

Но в моем случае я не могу использовать что-то вроде этого:

Optional<? extends Property<Object>> property = traversal.properties(key).tryNext();
if (property.isPresent()) {
    Object oldValue = property.get().value();
    if (oldValue instanceof String && value instanceof String) {
        traversal.property(key, oldValue .toString() + value.toString());
    }
} else {
    traversal.property(key, value);
}

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

Я пытаюсь сделать что-то подобное:

traversal.coalesce(__.has(key).property(value, __.properties(key).next().value() + value),
__.property(key, value));

Но, конечно, это что-то сумасшедшее, и я также не могу проверить, является ли значение String перед добавить новое значение, в таком случае

Как мне решить мой вопрос?

1 Ответ

1 голос
/ 10 февраля 2020

Gremlin пока не имеет функций манипуляции со строками, поэтому это невозможно сделать в Gremlin без использования лямбд:

gremlin> g.V().has('person','name','marko').sideEffect{it.get().property('name', it.get().value('name') + 'a')}
==>v[1]
gremlin> g.V().has('person','name','marko')
gremlin> g.V().has('person','name','markoa')
==>v[1]

В приведенном выше примере используется TinkerGraph, но в зависимости от базы данных графа вы при использовании вы можете увидеть немного другое поведение и, возможно, потребуется написать лямбду другим способом, чтобы получить тот же результат (например, я не думаю, что такой подход будет работать с DS Graph, потому что я не думаю, что вы можете вызвать property(key,value) метод объекта Vertex с этой реализацией).

Очевидно, у вас также есть возможность сделать эту мутацию в двух отдельных обходах:

gremlin> oldVal = g.V().has('person','name','marko').values('name').next()
==>marko
gremlin> oldVal = g.V().has('person','name','marko').property('name',oldVal + 'a')
==>v[1]
gremlin> g.V().has('person','name','marko')
gremlin> g.V().has('person','name','markoa')
==>v[1]

Надеюсь, String манипуляция функции, а также другие операции, определяющие тип c, такие как функции Date, будут доступны в следующих выпусках. Часть этого обсуждения происходит на TINKERPOP-2334 .

...