将 valueMap 与 match() 结合使用
Using valueMap with match()
我正在远程调用 JanusGraph,默认情况下 returns 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 中的限制/错误?
谢谢
您只需调整 select()
即可将 valueMap()
应用到您 return 的每一列。下面是一个使用 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();
我正在远程调用 JanusGraph,默认情况下 returns 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 中的限制/错误?
谢谢
您只需调整 select()
即可将 valueMap()
应用到您 return 的每一列。下面是一个使用 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();