tugraph-db兼容neo4j的通讯协议,因此可以使用neo4j的驱动连接tugraph-db的server。

bolt driver 使用介绍

bolt driver 使用例子

终端连接

驱动是业务代码里面使用的,对于服务器上终端访问,可以使用cli客户端。

console client 使用介绍

子图操作

创建子图

CALL dbms.graph.createGraph('graph1')

该操作会同步变更所有该类型点的属性数据,数据量大的时候,有时间消耗。

如下例子,对于点类型node1,一次添加了两个字段:field1,字符串类型,可选,默认值是 null; field2int64类型,必选,默认值是0.

CALL db.alterLabelAddFields('vertex', 'node1', ['field1', string, null ,true], ['field2', int64, 0, false])

如下例子,对于点类型node1,给field1字段添加了一个非唯一索引。

CALL db.addIndex('node1', 'field1', false)

如下例子,对于点类型node1,给field2字段添加了一个唯一索引。

CALL db.addIndex('node1', 'field2', true)

该操作会同步变更所有该类型边的属性数据,数据量大的时候,有时间消耗。

如下例子,对于边类型edge1,一次添加了两个字段: field1,字符串类型,可选,默认值是 null; field2int64类型,必选,默认值是0.

CALL db.alterLabelAddFields('edge', 'edge1', ['field1', string, null ,true], ['field2', int64, 0, false])

如下例子,对于边类型edge1,给字段field1添加了一个非唯一索引。

CALL db.addEdgeIndex('edge1', 'field1', false, false)

如下例子,对于边类型edge1,给字段field2添加了一个唯一索引。

CALL db.addEdgeIndex('edge1', 'field2', true, false)

批量upsert点数据

如果不存在就插入点,如果存在就更新点的属性,根据点的主键字段值判断是否存在。

第二个参数是一个list类型,每个list里面的元素是个map类型,每个map里面是点的字段和对应的值。

推荐使用driver里面的参数化特性,第二个参数直接传入一个 list结构体,避免自己构造语句。

CALL db.upsertVertex('node1', [{id:1, name:'name1'},{id:2, name:'name2'}])

批量upsert边数据

如果两点之间不存在某条类型的边就插入,如果存在就更新该边的属性,也就是两点之间同类型的边只能有一条。

第四个参数是一个list类型,每个数组里面的元素是个map类型,每个map里面是:边的起点类型主键字段和对应的值、边的终点类型主键字段和对应的值、边类型自身的属性字段和值。每个map里面至少有两个元素。

第二个参数和第三个参数是为第四个参数服务的。分别说明了起点和终点的类型是什么,以及第四个参数中那个字段代表起点主键字段值,那个字段代表终点主键字段值。

注:第二个参数和第三个参数中配置的起点和终点的主键字段并不是起点和终点schema中的主键字段名,只是起一个占位和区别的作用,方便识别第四个参数中哪个字段代表起点和终点的主键字段。

推荐使用driver里面的参数化特性,避免自己构造语句。

CALL db.upsertEdge('edge1',{type:'node1',key:'node1_id'}, {type:'node2',key:'node2_id'}, [{node1_id:1,node2_id:2,score:10},{node1_id:3,node2_id:4,score:20}])

批量upsert边数据-根据边的属性确定唯一

上面描述的upsert逻辑是两点之间同类型的边只能有一条,如果要求两点之间同类型的边可以有多条,并且根据边上的某个属性来确定唯一,需要在原来的基础上多加一个字段,如下:

CALL db.upsertEdge('edge1',{type:'node1',key:'node1_id'}, {type:'node2',key:'node2_id'}, [{node1_id:1,node2_id:2,score:10},{node1_id:3,node2_id:4,score:20}], 'score')

在最后多了一个字段score, 逻辑变成:如果两点之间不存在一条edge1类型的边,并且score值等于某个值,就插入;否则就更新改边的属性。 边上的score字段需要提前加上一个特殊的pair unique索引,如下:

CALL db.addEdgeIndex('edge1', 'score', false, true)

DataX

https://github.com/ljcui/DataX/tree/bolt 自行编译。

这个DataX实现的 tugraph writer 内部调用的是上面描述的db.upsertVertexdb.upsertEdge, tugraph reader 内部调用的是TuGraph 的 bolt client,支持流式读取, 具体使用方式见TuGraph-DataX 使用介绍

离线脱机导入数据

如果你有子图的schema以及子图里面所有的点边数据(csv或者json格式),可以利用lgraph_import工具离线将这些数据生成图数据。

该方式适合初始阶段,先灌进去一批全量数据。注意server要停机,导入完再启动server,可以看到生成的子图数据。

参考 lgraph_import 使用介绍 中的离线全量导入部分

导出数据

在线远程流式导出数据

lgraph_cli 使用介绍

CSV 格式

echo "match(n:person) return n.id, n.name;" | lgraph_cli --ip 127.0.0.1 --port 7687 --graph default --user admin --password 73@TuGraph --format csv > output.txt

JSON 格式

echo "match(n:person) return n.id, n.name;" | lgraph_cli --ip 127.0.0.1 --port 7687 --graph default --user admin --password 73@TuGraph --format json > output.txt

lgraph_export 使用介绍

CSV 格式

lgraph_export -d your_db_path -e export_data -g default -f json -u admin -p 73@TuGraph

JSON 格式

lgraph_export -d your_db_path -e export_data -g default -f json -u admin -p 73@TuGraph