ngbatis icon indicating copy to clipboard operation
ngbatis copied to clipboard

TODOLIST

Open CorvusYe opened this issue 2 years ago • 4 comments

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
      

CorvusYe avatar Nov 30 '22 15:11 CorvusYe

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进行赋值?

image

soul-gin avatar Jan 30 '23 09:01 soul-gin

@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 ); 

以上几个方案还是让人比较纠结的。

CorvusYe avatar Jan 30 '23 15:01 CorvusYe

方案3对目前代码侵入性小,能复用insertTripletBatch确实是个不错选择,NgTriplet是否还需要rank属性,还是通过注解获取? 方案1相比较侵入性大些,在某些场景下更适用(src, dst数据来源与edge不同, 只是根据一份数据插入多条边).

soul-gin avatar Feb 02 '23 02:02 soul-gin

方案三以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 的熟悉成本更低。

CorvusYe avatar Feb 02 '23 03:02 CorvusYe