Использование valueMap с match () - PullRequest
0 голосов
/ 05 декабря 2018

Я вызываю JanusGraph remote, который возвращает ReferenceVertex по умолчанию.Чтобы получить свойства, я также использую valueMap (), которая хорошо работает для простых запросов.

Однако в моем случае мне нужно создать соединение, которое хорошо работает на основе ReferenceVertex следующим образом:

// select t1.table2_ID, t2.table2_ID from table1 as t1 inner join table2 as t2 on t1.table2_ID = t2.table2_ID

GraphTraversal<?, ?> t1 = __.start().as("table1").out("relatesTo").hasLabel("table2").as("table2");
GraphTraversal<?, ?> t2 = g.V().hasLabel("table1").match(t1).select("table1", "table2");
List<?> l = t2.toList();

При добавлении valueMap к обходу для извлечения свойств происходит сбой.Я хочу включить определенные свойства следующим образом:

// select t1.column1, t2.column2 from table1 as t1 inner join table2 as t2 on p.table2_ID = c.table2_ID

GraphTraversal<?, ?> t1 = __.start().as("table1").out("relatesTo").hasLabel("table2").valueMap(true, "column2").as("table2");
GraphTraversal<?, ?> t2 = g.V().hasLabel("table1").valueMap(true, "column1").match(t1).select("table1", "table2");
List<?> l = t2.toList();

-> java.util.HashMap не может быть приведен к org.apache.tinkerpop.gremlin.structure.Element

Я построил неправильный обход, или это ограничение / ошибка в Tinkerpop?

Спасибо

1 Ответ

0 голосов
/ 05 декабря 2018

Вы можете просто модулировать select(), чтобы применить valueMap() к каждому возвращаемому столбцу.Вот пример, использующий современный игрушечный граф, который поставляется с TinkerPop:

gremlin> g.V().as('a').out().as('b').select('a','b').by(valueMap())
==>[a:[name:[marko],age:[29]],b:[name:[lop],lang:[java]]]
==>[a:[name:[marko],age:[29]],b:[name:[vadas],age:[27]]]
==>[a:[name:[marko],age:[29]],b:[name:[josh],age:[32]]]
==>[a:[name:[josh],age:[32]],b:[name:[ripple],lang:[java]]]
==>[a:[name:[josh],age:[32]],b:[name:[lop],lang:[java]]]
==>[a:[name:[peter],age:[35]],b:[name:[lop],lang:[java]]]

, поэтому в вашем случае вы просто должны сделать:

GraphTraversal<?, ?> t1 = __.start().as("table1").out("relatesTo").hasLabel("table2").as("table2");
GraphTraversal<?, ?> t2 = g.V().hasLabel("table1").match(t1).select("table1", "table2").by(__.valueMap());
List<?> l = t2.toList();

Тем не менее, если вы не сократили свой коднемного для цели этого вопроса, я не уверен, что вижу необходимость в match() в этом случае.Похоже, вы могли бы просто упростить это до:

List<?> l = g.V().hasLabel("table1").
              out("relatesTo").hasLabel("table2").as("table2").
              select("table1", "table2").
                by(__.valueMap()).toList();
...