ngbatis
ngbatis copied to clipboard
TODOLIST
TODOLIST
-
[x] Change nebula-client dependence from 3.0.0 to 3.3.0
-
[x] Use nebula-client SessionPool
-
[ ] Move unit test from ngbatis-demo to ngbatis
-
[ ] Add batch interface in NebulaDaoBasic :
- [ ] insertTripletBatch
- [x] insertEdgeBatch
- [ ] show metas
-
[ ] ResultSetUtil more column types support
- [ ] Geography
- [x] Duration
-
[x] Vertex multi labels support.
-
[ ] i18n: docs / comments / examples
-
[ ] Performance optimization of nGQL in NebulaDaoBasic
-
[ ] selectByIds
MATCH(n) WHERE id(n) == <id> RETURN n -
[ ] selectByIds
MATCH(n: <tag_name>) WHERE id(n) in <id_list> RETURN n -
[ ] selectBySelective
MATCH(n: <tag_name>) WHERE 1 == 1 <and id(n) == <id>> [ and n.`<tag_name>`.<prop_name> == <prop_value> ] RETURN n LIMIT 4000 -
[ ] selectBySelectiveStringLike
MATCH(n: <tag_name>) WHERE 1 == 1 <and id(n) == <id>> [ and n.`<tag_name>`.<prop_name> =~ '.*<prop_value>.*' ] RETURN n LIMIT 4000 -
[ ] selectIdBySelective
MATCH(n: <tag_name>) WHERE 1 == 1 <and id(n) == <id>> [ and n.`<tag_name>`.<prop_name> == <prop_value> ] RETURN id(n) LIMIT 4000 -
[ ] selectIdBySelectiveStringLike
MATCH(n: <tag_name>) WHERE 1 == 1 <and id(n) == <id>> [ and n.`<tag_name>`.<prop_name> =~ '.*<prop_value>.*' ] RETURN id(n) LIMIT 4000 -
[ ] selectByMap
MATCH (n:`${ tagName }`) WHERE 1 == 1 [ and n.`<tag_name>`.<prop_name> == <prop_value> ] RETURN n LIMIT 4000 -
[ ] countByMap
MATCH (n:`${ tagName }`) WHERE 1 == 1 [ and n.`<tag_name>`.<prop_name> == <prop_value> ] RETURN count(n) -
[ ] selectPage
MATCH (n:${ tag }) WHERE [ [ and ] n.`<tag_name>`.<prop_name> == <prop_value> ] RETURN n skip <start_row>limit <page_size> -
[ ] countPage
MATCH (n:`${ tagName }`) WHERE [ [ and ] n.`<tag_name>`.<prop_name> == <prop_value> ] RETURN n skip <start_row>limit <page_size> -
[ ] insert
INSERT VERTEX IF NOT EXISTS `<tag_name>` ( <prop_name_group> ) VALUES <id> : ( <prop_value_group> ) -
[ ] insertBatch
INSERT VERTEX IF NOT EXISTS `<tag_name>` ( <prop_name_group> ) VALUES [<id> : ( <prop_value_group> ) [,] ] -
[ ] updateById 、updateByIdSelective
UPDATE VERTEX ON `<tag_name>` <id> [ SET [ <prop_group> ] ] YIELD <id> as <primary_key_name>, <prop_name_group> -
[ ] updateByIdBatchSelective
[ UPDATE VERTEX ON `<tag_name>` <id> SET [ <prop_name> = <prop_value> [,] ] ] -
[ ] deleteWithEdgeById
DELETE VERTEX <v_id> WITH EDGE -
[ ] deleteById
DELETE VERTEX <v_id> -
[ ] insertEdge insertEdgeSelective
INSERT EDGE `<edge_name>` ( <prop_name_group> ) VALUES <v_id_1>-> <v_id_2> @<ranking> :( <prop_value_group> ); -
[ ] upsertEdgeSelective
UPSERT EDGE ON `<tag_name>` <v_id_1> -> <v_id_2> @[ranking] [ SET [ `<prop_name>` = <prop_value> [, ] ] ] -
[ ] existsEdge
MATCH (n)-[r: <edge_name>]-(n2) WHERE id(n) == $p0 AND id(n2) == <v_id_2> RETURN count(*) > 0 -
[ ] listStartNodes
MATCH (n: `<tag_name>`)-[r: `<edge_name>`]->(n2) WHERE id(n2) == <v_id_2> RETURN n -
[ ] startNode
MATCH (n: `<tag_name>`)-[r: `<edge_name>`]->(n2) WHERE id(n2) == <v_id_2> RETURN n LIMIT 1
-
insertEdgeBatch 如果扩展 insertEdge(Object v1, Object e, Object v2) 似乎不太好处理, 是否考虑使用类似 NgEdge<I> 的对象结构(类似离线批处理, vid srcVid dstVid rank为一类, 其他column为一类), 并在 KvFn.KV 中添加 vid srcVid dstVid rank 属性? 在定义java bean中, 是否需要使用自定义注解来区分, 根据@Key 中name值(指定常量)对KvFn.KV进行赋值?

@soul-gin 连同上面提的方案,大概有三种方案可以参考:
// 方案1
insertEdgeBatch( List<E> edges ); // 使用注解并拓展KvFn
// 方案2
insertEdgeBatch( List<?> srcIdList, List<E> edges, List<?> dstIdList );
// 方案3,考虑与 insertTripletBatch 统一入参
class NgTriplet<ID> {
ID srcId;
ID dstId;
Object start;
Object edge;
Object end;
}
// 插入 start edge end 三元组数据
insertTripletBatch( List<NgTriplet> triples );
// 仅插入 edge,节点数据使用 srcId 或 start.getId,与 insertEdge 参数的逻辑保持一致
insertEdgeBatch( List<NgTriplet> triples );
以上几个方案还是让人比较纠结的。
方案3对目前代码侵入性小,能复用insertTripletBatch确实是个不错选择,NgTriplet是否还需要rank属性,还是通过注解获取? 方案1相比较侵入性大些,在某些场景下更适用(src, dst数据来源与edge不同, 只是根据一份数据插入多条边).
方案三以ngbatis-demo里的实为例:
NgTriplet triplet = new NgTriplet();
triplet.setStart( new Person("Tom") ); // setStart 或 setSrcId 二者选其一,与 insertEdge 方法的入参逻辑一致
triplet.setEdge( new Like() );
triplet.setEnd( new Person("Jerry") ); // setEnd 或 setDstId 二选一
这样的元组构成集合,实体不需要重新再定义,之前的注解也不需要有所变动,直接可以复用。 同时构成的入参,批增点跟批增边 形式一致,api 的熟悉成本更低。