Как внедрить карту и фильтр на основе содержимого карты в gremlin - PullRequest
0 голосов
/ 04 августа 2020

Я запускаю сервер JanusGraph и подключаюсь к нему из консоли gremlin.

Как можно видеть, у меня есть две вершины со свойством id, равным 1 и 2

gremlin> g.addV('user').property('id', 1)
==>v[4224]
gremlin> g.addV('user').property('id', 2)
==>v[4192]
gremlin> g.V().valueMap()
==>{id=[2]}
==>{id=[1]}

Далее , Я внедрил массив карт с разными свойствами. Я пытаюсь l oop поверх этой карты и фильтровать вершины, но не могу понять, почему запрос не работает. Может ли кто-нибудь помочь мне разобраться в правильном запросе?

Я пробовал использовать этап терминала next () после select ("id"), но это тоже не удалось.

gremlin> g.inject([["id": 1], ["id": 2, "something":"anything"]]).unfold().as("m").V().has("user", "id", select("m").select("id"))
Value [[SelectOneStep(last,m), SelectOneStep(last,id)]] is not an instance of the expected data type for property key [id] and cannot be converted. Expected: class java.lang.Integer, found: class org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal
Type ':help' or ':h' for help.
Display stack trace? [yN]

Я не могу используйте g.V().has(label, key, within(...)), так как мне нужно использовать одну и ту же карту в нескольких местах и ​​повторять шаги для каждой строки.

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Я бы, вероятно, использовал другой подход к моему обходу и избегал inject() в этом случае. С помощью inject() вам нужно будет развернуть свой список Map объектов, а затем выполнить поиск вершин для каждого, что, вероятно, дорого для всех графических систем, если ваш список длинный. Я бы также поинтересовался, можете ли вы написать обход таким образом, чтобы системы графов могли оптимизировать поиск вершин с помощью индекса.

Учитывая все это и вашу конечную цель обхода, чтобы обновить свойства из найденных вершин, я думаю, я бы выбрал такой подход:

gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV('user').property('id', 1)
==>v[0]
gremlin> g.addV('user').property('id', 2)
==>v[2]
gremlin> m = [["id": 1], ["id": 2, "something":"anything"]]
==>[id:1]
==>[id:2,something:anything]
gremlin> ids = m.collect{it.id}
==>1
==>2
gremlin> g.withSideEffect('m',m).
......1>   V().has('user','id',within(ids)).as('v').
......2>   sideEffect(select('m').unfold().
......3>              filter(select('id').as('ii').
......4>                     where('ii',eq('v')).
......5>                       by().
......6>                       by('id')).
......7>              unfold().as('kv').
......8>              select('v').
......9>              property(select('kv').by(keys),select('kv').by(values)))
==>v[0]
==>v[2]
gremlin> g.V().elementMap()
==>[id:0,label:user,id:1]
==>[id:2,label:user,id:2,something:anything]

Здесь мы находим все вершины с within() как один поиск, а затем filter() список данных по текущей вершине "id", чтобы затем обновить свойства.

0 голосов
/ 04 августа 2020

Попробуйте следующий запрос, он должен сработать:

g.inject([["id": 1], ["id": 2, "something":"anything"]]).
  unfold().as("m").
  V().
  hasLabel("user").
  has("id", select("m").select("id")).
  dedup()

Ваш запрос завершился неудачно, потому что has(label, propertyKey, traversal) недопустимый синтаксис. Вы можете использовать has(label, propertyKey, propertyValue) или has(label, propertyKey, predicate)

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