запрос сервера gremlin для добавления края

Я играю с titan db (бэкэнд cassandra и es). Я отправляю запросы на сервер gremlin через модуль gremlin-javascript в nodejs. Мне удалось написать вершины getOrInsert в titan, используя graph.traversal().V().has(idKey,idVal).tryNext().orElseGet{ graph.addVertex(T.label,"product","product_id",991);graph.tx().commit();

Но проблема, с которой я столкнулся, заключается в том, как добавить ребро между двумя вершинами. Обычно мы делаем в gremlin

a=graph.traversal().addVertex(...some properties);
b=graph.traversal().addVertex(...some properties);
a.addEdge("someEdgeType",b);

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

// JavaScript
var query = gremlin();
var bob = query.var(g.addVertex({ name: 'Bob' }));
var alice = query.var(g.addVertex({ name: 'Alice' }));
query(g.addEdge(bob, alice, 'likes', { since: 'now' }));

Я не могу использовать модуль grex (он поддерживает 2.0), так как я использую gremlin 3.0.1 и формат написания запросов изменился (я думаю!).

Мой вариант использования: у меня должна быть возможность отправлять запросы гремлина на удаленный сервер гремлина.

Есть ли какой-либо другой модуль, похожий на grex, чтобы упростить создание запросов? Как мне создавать ребра, запрашивая сервер gremlin?


person palash kulshreshtha    schedule 03.05.2016    source источник
comment
Попробуйте npmjs.com/package/gremlin для JS с Titan 1.0 / TinkerPop 3.0.1   -  person Jason Plurad    schedule 03.05.2016
comment
Спасибо, Джейсон. Используя тот же модуль. при выполнении этого запроса g.V(245764248).next().addEdge("somerelation",g.V(245764248).next()).tx().commit(); отношение создается, но не фиксируется. Невозможно понять, почему.   -  person palash kulshreshtha    schedule 03.05.2016


Ответы (1)


Во-первых, выполнение graph.traversal() - не лучший образец для подражания. Создайте свой GraphTraversalSource один раз и используйте его повторно:

gremlin> graph = TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]

Что касается вашей проблемы, ваша строка кода "getOrInsert" возвращает Vertex, поэтому просто используйте ее для создания своего Edge:

gremlin> v1 = g.V().has('k',1).tryNext().orElseGet{graph.addVertex('k',1)}
==>v[0]
gremlin> v1.addEdge('self',v1)
==>e[2][0-self->0]
person stephen mallette    schedule 03.05.2016
comment
Спасибо, Стивен. Мой график инициализируется на сервере gremlin через gremlin-server.yaml. Я отправляю запросы на сервер gremlin через модуль javascript-gremlin. Он поддерживает строковые запросы. Поэтому каждый раз, когда я звоню, мне придется вызывать graph.traversal () ... (если я здесь ничего не упускаю). - person palash kulshreshtha; 03.05.2016
comment
g или как вы назвали свой график в файле конфигурации yaml, уже должен быть привязан к серверу Gremlin при его инициализации. вам не нужно вызывать graph.traversal() в вашем скрипте. - person stephen mallette; 03.05.2016
comment
спасибо, Вы абсолютно правы. Я только что узнал, что граф привязан к StandardTitanGraph, а g привязан к graph.traversal (). В gremlin-server.yaml его графики: {graph: conf / titan-cassandra-es.properties}. Но часть моего вопроса все еще остается, я должен сделать что-то вроде g.V (81924272) .addEdge (buys, g.V (163844256)). где 81924272 = идентификатор вершины клиента & 163844256 = идентификатор вершины продукта - person palash kulshreshtha; 03.05.2016
comment
так почему бы не сделать это? Я имею в виду, что ваш синтаксис немного сбился, но это нормально: g.V().has('customerId',81924272).next().addEdge("buys",g.V().has('productId',163844256).next()). или просто используйте переменную, как я сделал выше в своем ответе. - person stephen mallette; 03.05.2016
comment
спасибо, что указали правильное направление. Я пытался использовать полученные внутренние идентификаторы вершин, потому что я думаю, что будет быстрее получить доступ к вершине через внутренний идентификатор вершины (== ›v [81924272]). В противном случае я бы дважды искал вершину в первый раз в getOrCreate и второй раз при добавлении ребра (думаю, накладные расходы). Еще кое-что. Есть идеи о поддержке grex для tinkerpop 3.0? - person palash kulshreshtha; 03.05.2016
comment
да - поиск идентификатора вершины будет быстрее. я не знаю о будущем grex. вам нужно будет связаться с автором. - person stephen mallette; 03.05.2016
comment
@palashkulshreshtha grex автор / сопровождающий здесь: grex, скорее всего, больше не будет обновляться. Если вам требуется HTTP-соединение с сервером Gremlin TP3, я планирую добавить поддержку этого в gremlin-javascript (см. github.com/jbmusso/gremlin-javascript) - person jbmusso; 03.05.2016
comment
@jbmusso спасибо. с вашим предложением на мой предыдущий вопрос. Я успешно использовал gremlin-javascript вместе с TP3. По Грексу точно будет не хватать. - person palash kulshreshtha; 04.05.2016