TinkerPop 3 - получить свойство вершины и края

Я хотел бы вернуть все вершины, у которых есть определенное ребро и дата добавления ребра, но я просто не могу это понять.

i.e.

g.V().out("likes").map{it -> it.dateLiked = it.outE("likes").property("addedOn"); it;}

В терминах SQL я могу думать об этом так:

SELECT item.*,
       edge.addedOn
  FROM item_table item,
       edge_mapping_table edge
 WHERE item.id = edge.item_id

person Brian F    schedule 30.01.2017    source источник


Ответы (1)


Вот один из способов сделать это на примере "современного" игрушечного графа:

gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().outE('knows').as('e').
           inV().as('v').
           select('e','v').by('weight').by(valueMap())
==>[e:0.5,v:[name:[vadas],age:[27]]]
==>[e:1.0,v:[name:[josh],age:[32]]]

Итак, вместо того, чтобы получать «addedOn» из ребра «нравится» и свойств вершины «элемент», я хочу получить «вес» из ребра «знает» и свойства вершины «человек». В первой строке мы проходим по "известному" ребру и помечаем его как 'e', ​​затем мы переходим к соседней вершине in person и маркируем ее как 'v'. Наконец, мы выбираем значения этих двух меток и применяем к ним by преобразования. by применяются циклически, так что первый by применяется к 'e', ​​а второй - к 'v'.

Использование valueMap немного удобно, но обычно вы будете знать данные, которые вы хотите получить из вершины, точно так же, как вы знали данные, которые вы извлекаете из края (то есть «вес»). Чтобы получить более приятный результат без всех встроенных Map, вы могли бы сделать:

gremlin> g.V().outE('knows').as('w').
           inV().as('a','n').
           select('w','a','n').
             by('weight').by('age').by('name')
==>[w:0.5,a:27,n:vadas]
==>[w:1.0,a:32,n:josh]
person stephen mallette    schedule 30.01.2017
comment
Молодец, спасибо за мини-урок! Из любопытства, есть ли еще один шаг, чтобы затем снова сгладить его, чтобы сказать [e: 0.5, name: vadas, age: 27]? - person Brian F; 31.01.2017
comment
Я полагаю, вы могли бы развернуть карту, но, возможно, лучше уточнить данные, которые вам нужны в первую очередь. Поскольку вы обычно не делаете select * from table в SQL, вы обычно не берете все данные из вершины. Таким образом, я представил несколько иное решение. - person stephen mallette; 31.01.2017