tugraph-db兼容neo4j的通讯协议,因此可以使用neo4j的驱动连接tugraph-db的server。
驱动是业务代码里面使用的,对于服务器上终端访问,可以使用cli客户端。
CALL dbms.graph.createGraph('graph1')
CALL dbms.graph.deleteGraph('graph1')
CALL db.dropDB()
CALL db.dropAllVertex()
CALL dbms.graph.getGraphSchema()
CALL dbms.graph.listGraphs()
CALL db.flushDB()
如下json定义了一个点类型,名字是node1
。
{
"label": "node1",
"primary": "id",
"type": "VERTEX",
"detach_property": true,
"properties": [{
"name": "id",
"type": "INT32",
"optional": false
}, {
"name": "name",
"type": "STRING",
"optional": false,
"index": true
}, {
"name": "num",
"type": "INT32",
"optional": false,
"index": true,
"unique": true
}, {
"name": "desc",
"type": "STRING",
"optional": true
}]
}
把上面这个json序列化成字符串,作为参数传入,建议使用驱动的参数化特性,避免自己拼接语句。
CALL db.createVertexLabelByJson($json_data)
CALL db.getVertexSchema('node1')
该操作会同步删除所有该类型的点数据,数据量大的时候,有时间消耗。
如下例子删除点类型node1
以及该类型的所有点数据。
CALL db.deleteLabel('vertex', 'node1')
该操作会同步变更所有该类型点的属性数据,数据量大的时候,有时间消耗。
如下例子,对于点类型node1
,一次添加了两个字段:field1
,字符串类型,可选,默认值是 null
; field2
,int64
类型,必选,默认值是0.
CALL db.alterLabelAddFields('vertex', 'node1', ['field1', string, null ,true], ['field2', int64, 0, false])
该操作会同步变更所有该类型点的属性数据,数据量大的时候,有时间消耗。
如下例子,对于点类型node1
,一次删除了两个字段: field1
和 field2
。
CALL db.alterLabelDelFields('vertex', 'node1', ['field1', 'field2'])
该操作会同步构建索引数据,数据量大的时候,有时间消耗。
如下例子,对于点类型node1
,给field1
字段添加了一个非唯一索引。
CALL db.addIndex('node1', 'field1', false)
如下例子,对于点类型node1
,给field2
字段添加了一个唯一索引。
CALL db.addIndex('node1', 'field2', true)
如下例子,对于点类型node1
,删除字段field1
上的索引。
CALL db.deleteIndex('node1', 'field1')
如下json定义了一个边的schema,名字是edge1
。
{
"label": "edge1",
"type": "EDGE",
"detach_property": true,
"constraints": [
["node1", "node2"]
]
"properties": [{
"name": "id",
"type": "INT32",
"optional": false
}, {
"name": "name",
"type": "STRING",
"optional": false,
"index": true
}, {
"name": "num",
"type": "INT32",
"optional": false,
"index": true,
"unique": true
}, {
"name": "desc",
"type": "STRING",
"optional": true
}]
}
把上面这个json序列化成字符串,作为参数传入,建议使用驱动的参数化特性,避免自己拼接语句。
CALL db.createEdgeLabelByJson($json_data)
CALL db.getEdgeSchema('edge1')
该操作会同步删除所有该类型的边,数据量大的时候,有时间消耗。
如下例子,删除边类型edge1
以及该类型的所有边数据。
CALL db.deleteLabel('edge', 'edge1')
该操作会同步变更所有该类型边的属性数据,数据量大的时候,有时间消耗。
如下例子,对于边类型edge1
,一次添加了两个字段: field1
,字符串类型,可选,默认值是 null
; field2
,int64
类型,必选,默认值是0
.
CALL db.alterLabelAddFields('edge', 'edge1', ['field1', string, null ,true], ['field2', int64, 0, false])
该操作会同步变更所有该类型边的属性数据,数据量大的时候,有时间消耗。
如下操作,对于边类型edge1
,一次删除了两个字段: field1
和 field2
。
CALL db.alterLabelDelFields('edge', 'edge1', ['field1', 'field2'])
该操作会同步构建索引数据,数据量大的时候,有时间消耗。
如下例子,对于边类型edge1
,给字段field1
添加了一个非唯一索引。
CALL db.addEdgeIndex('edge1', 'field1', false, false)
如下例子,对于边类型edge1
,给字段field2
添加了一个唯一索引。
CALL db.addEdgeIndex('edge1', 'field2', true, false)
如下例子,对于边类型edge1
,删除字段field1
上的索引。
CALL db.deleteEdgeIndex('edge1', 'field1')
如下例子返回所有的点边类型,以及每种类型当前的数据量是多少。
读的是统计数据,轻操作。
CALL dbms.meta.countDetail()
如果不存在就插入点,如果存在就更新点的属性,根据点的主键字段值判断是否存在。
第二个参数是一个list
类型,每个list
里面的元素是个map
类型,每个map
里面是点的字段和对应的值。
推荐使用driver里面的参数化特性,第二个参数直接传入一个 list
结构体,避免自己构造语句。
CALL db.upsertVertex('node1', [{id:1, name:'name1'},{id:2, name:'name2'}])
如果两点之间不存在某条类型的边就插入,如果存在就更新该边的属性。
第四个参数是一个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}])
https://github.com/ljcui/DataX/tree/bolt 自行编译。
这个DataX实现的 tugraph writer 内部调用的是上面描述的db.upsertVertex
和db.upsertEdge
。
这个DataX实现的 tugraph reader 内部调用的是TuGraph 的 bolt client,支持流式读取
如果你有子图的schema以及子图里面所有的点边数据(csv或者json格式),可以利用lgraph_import
工具离线将这些数据生成图数据。
该方式适合初始阶段,先灌进去一批全量数据。注意server要停机,导入完再启动server,可以看到生成的子图数据。
参考 lgraph_import 使用介绍 中的离线全量导入部分
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
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
对于不兼容的版本之间迁移数据,可以使用lgraph_export
将旧版本server里面的数据全部导出成文本(里面包含图schema以及所有的点边数据),然后再选择合适的方法将这些文本数据导入到新版本。