这是本节的多页打印视图。
点击此处打印 .
返回本页常规视图 .
客户端与 API 本节包含 REST API、Gremlin Console 和客户端说明。当前 Server REST API 使用图空间和图名称组成资源路径;具体路径以各 API 页面和 Server 的 OpenAPI 页面为准。
1 - HugeGraph RESTful API ⚠️ 版本兼容性说明
当前 API 的图资源路径以 /graphspaces/{graphspace}/graphs/{graph} 开头。 HugeGraph 1.5.x 及更早版本使用 /graphs/{graph}。创建、克隆图等接口的请求格式也与当前版本不同。 默认图空间名是 DEFAULT。 旧版本 doc 参考:HugeGraph 1.5.x RESTful API Server 启动后,可访问 http://localhost:8080/swagger-ui/index.html 查看当前版本的 OpenAPI 页面。使用示例
1.1 - Graphspace API Graphspace(图空间)REST 接口:多租户与资源隔离的创建、查看、更新与删除,以及使用前置条件与限制。
2.0 Graphspace 在 HugeGraph 中,多租户是通过图空间(graph space)来实现的,资源的分配和隔离可以通过图空间进行。
重要前置条件 :
目前图空间功能只支持在 hstore 模式下使用。 如果非 hstore 模式,则只能使用默认的图空间 DEFAULT,且不支持创建、删除和更新图空间的操作。 注意在 rest-server.properties 中,设置 usePD=true,并且 hugegraph.properties 中,设置 backend=hstore 图空间功能必须开启鉴权模式,默认账密为 admin:pa(见 auth.admin_pa 配置项),请务必修改默认密码,防止未授权访问。 本页所有接口都只在 PD 模式下可用,单机模式下会返回 400 和 GraphSpace management is not supported in standalone mode 错误信息。 2.0.1 创建一个图空间 Method & Url POST http://localhost:8080/graphspacesRequest Body 注意:目前 cpu,内存,以及 k8s 相关功能暂未开放
{
"name" : "gs1" ,
"description" : "1st graph space" ,
"max_graph_number" : 100 ,
"cpu_limit" : 1000 ,
"memory_limit" : 8192 ,
"storage_limit" : 1000000 ,
"max_role_number" : 10 ,
"auth" : true ,
"configs" : {}
} Response Status Response Body {
"name" : "gs1" ,
"nickname" : "gs1" ,
"description" : "1st graph space" ,
"cpu_limit" : 1000 ,
"memory_limit" : 8192 ,
"storage_limit" : 1000000 ,
"compute_cpu_limit" : 0 ,
"compute_memory_limit" : 0 ,
"oltp_namespace" : "hugegraph-server" ,
"olap_namespace" : "hugegraph-server" ,
"storage_namespace" : "hugegraph-server" ,
"operator_image_path" : "127.0.0.1/hugegraph-registry/hugegraph-computer-operator:3.1.1" ,
"internal_algorithm_image_url" : "127.0.0.1/hugegraph-registry/hugegraph-computer-algorithm:3.1.1" ,
"max_graph_number" : 100 ,
"max_role_number" : 10 ,
"cpu_used" : 0 ,
"memory_used" : 0 ,
"storage_used" : 0 ,
"storage_percent" : 0.0 ,
"graph_number_used" : 0 ,
"role_number_used" : 0 ,
"auth" : true ,
"creator" : "admin" ,
"create_time" : "2024-05-01 12:00:00" ,
"update_time" : "2024-05-01 12:00:00"
} 2.0.2 列出系统所有图空间 Method & Url GET http://localhost:8080/graphspacesResponse Status Response Body {
"graphSpaces" : [
"gs1" ,
"DEFAULT"
]
} 2.0.3 查看某个图空间 Params 路径参数说明:
Method & Url GET http://localhost:8080/graphspaces/gs1Response Status Response Body {
"name" : "gs1" ,
"nickname" : "gs1" ,
"description" : "1st graph space" ,
"cpu_limit" : 1000 ,
"memory_limit" : 8192 ,
"storage_limit" : 1000000 ,
"oltp_namespace" : "hugegraph-server" ,
"olap_namespace" : "hugegraph-server" ,
"storage_namespace" : "hugegraph-server" ,
"operator_image_path" : "127.0.0.1/hugegraph-registry/hugegraph-computer-operator:3.1.1" ,
"internal_algorithm_image_url" : "127.0.0.1/hugegraph-registry/hugegraph-computer-algorithm:3.1.1" ,
"compute_cpu_limit" : 0 ,
"compute_memory_limit" : 0 ,
"max_graph_number" : 100 ,
"max_role_number" : 10 ,
"cpu_used" : 0 ,
"memory_used" : 0 ,
"storage_used" : 0 ,
"storage_percent" : 0.0 ,
"graph_number_used" : 0 ,
"role_number_used" : 0 ,
"auth" : true ,
"creator" : "admin" ,
"create_time" : "2024-05-01 12:00:00" ,
"update_time" : "2024-05-01 12:00:00" ,
"dp_username" : "gs1_dp" ,
"dp_password" : "a1b2c3d4e5f60718"
} dp_username 和 dp_password 由图空间名称推导得到,只有该接口会返回这两个字段。
2.0.4 更新某个图空间 注意:auth 鉴权配置,在创建图空间的过程一旦确定下来,不允许更新
Params 路径参数说明:
请求体说明:
action: 标记本次操作为 Update 动作,取值固定为 “update” update: 即将更新的值,下述参数都应置于 update 中 Method & Url PUT http://localhost:8080/graphspaces/gs1Request Body {
"action" : "update" ,
"update" : {
"name" : "gs1" ,
"description" : "1st graph space" ,
"cpu_limit" : 2000 ,
"memory_limit" : 40960 ,
"storage_limit" : 2048 ,
"oltp_namespace" : "hugegraph-server" ,
"olap_namespace" : "hugegraph-server" ,
"operator_image_path" : "127.0.0.1/hugegraph-registry/hugegraph-computer-operator:3.1.1" ,
"internal_algorithm_image_url" : "127.0.0.1/hugegraph-registry/hugegraph-computer-algorithm:3.1.1" ,
"max_graph_number" : 1000 ,
"max_role_number" : 100
}
} Response Status Response Body {
"name" : "gs1" ,
"nickname" : "gs1" ,
"description" : "1st graph space" ,
"cpu_limit" : 2000 ,
"memory_limit" : 40960 ,
"storage_limit" : 2048 ,
"oltp_namespace" : "hugegraph-server" ,
"olap_namespace" : "hugegraph-server" ,
"storage_namespace" : "hugegraph-server" ,
"operator_image_path" : "127.0.0.1/hugegraph-registry/hugegraph-computer-operator:3.1.1" ,
"internal_algorithm_image_url" : "127.0.0.1/hugegraph-registry/hugegraph-computer-algorithm:3.1.1" ,
"compute_cpu_limit" : 0 ,
"compute_memory_limit" : 0 ,
"max_graph_number" : 1000 ,
"max_role_number" : 100 ,
"cpu_used" : 0 ,
"memory_used" : 0 ,
"storage_used" : 0 ,
"storage_percent" : 0.0 ,
"graph_number_used" : 0 ,
"role_number_used" : 0 ,
"auth" : true ,
"creator" : "admin" ,
"create_time" : "2024-05-01 12:00:00" ,
"update_time" : "2024-05-01 12:30:00"
} 2.0.5 删除某个图空间 Params 路径参数说明:
Method & Url DELETE http://localhost:8080/graphspaces/gs1Response Status 注意:删除图空间,会导致图空间的全部资源被释放。
2.0.6 列出系统所有图空间及其详情 Params 请求参数说明:
prefix: 只返回名称或显示名以该前缀开头的图空间 Method & Url GET http://localhost:8080/graphspaces/profileResponse Status Response Body 每条记录包含与 GET /graphspaces/{graphspace} 相同的字段,并额外带上 authed、default、create_time 和 update_time。authed 表示当前用户是否可以进入该图空间:当图空间开启了鉴权,而当前用户既不是管理员、也不是该空间的管理员或成员时为 false。default 目前恒为 false,默认图空间功能尚未实现。
[
{
"name" : "gs1" ,
"nickname" : "gs1" ,
"description" : "1st graph space" ,
"cpu_limit" : 1000 ,
"memory_limit" : 8192 ,
"storage_limit" : 1000000 ,
"compute_cpu_limit" : 0 ,
"compute_memory_limit" : 0 ,
"oltp_namespace" : "hugegraph-server" ,
"olap_namespace" : "hugegraph-server" ,
"storage_namespace" : "hugegraph-server" ,
"max_graph_number" : 100 ,
"max_role_number" : 10 ,
"cpu_used" : 0 ,
"memory_used" : 0 ,
"storage_used" : 0 ,
"storage_percent" : 0.0 ,
"graph_number_used" : 0 ,
"role_number_used" : 0 ,
"auth" : true ,
"creator" : "admin" ,
"authed" : true ,
"default" : false ,
"create_time" : "2024-05-01 12:00:00" ,
"update_time" : "2024-05-01 12:30:00"
}
] 默认角色
每个图空间内置四种默认角色,可以一次性把一整组权限赋给某个用户或角色:
space:图空间管理员,只有管理员可以授予space_member:图空间成员analyst:图空间分析师observer:只读角色,传入 graph 时可以收窄到单个图user 既可以是用户名,也可以是角色名。当前用户是否具备某个默认角色也可以通过 GET /graphspaces/{graphspace}/auth/managers/default 查询,参见 Authentication API 。
2.0.7 授予默认角色 Params 路径参数说明:
请求体说明:
user: 用户名或角色名,必填 role: 取值为 space、space_member、analyst、observer 之一,必填 graph: 图名称,选填,只在 role=observer 时生效 Method & Url POST http://localhost:8080/graphspaces/gs1/roleRequest Body {
"user" : "boss" ,
"role" : "analyst"
} Response Status Response Body 只有在单个图上授予角色时才会回显 graph。
{
"user" : "boss" ,
"role" : "analyst" ,
"graphSpace" : "gs1"
} 2.0.8 查询默认角色 Params 路径参数说明:
请求参数说明:
user: 用户名或角色名,必填 role: 默认角色名称,必填 graph: 图名称,选填,只在 role=observer 时生效 Method & Url GET http://localhost:8080/graphspaces/gs1/role?user=boss&role=analystResponse Status Response Body 2.0.9 回收默认角色 Params 路径参数说明:
请求参数说明:
user: 用户名或角色名,必填 role: 默认角色名称,必填 graph: 图名称,选填,只在 role=observer 时生效 Method & Url DELETE http://localhost:8080/graphspaces/gs1/role?user=boss&role=analystResponse Status Schema 模板
Schema 模板把一段 Gremlin schema 脚本以名称保存下来,创建图时通过 schema 字段引用它来初始化图,参见 Graphs API 。模板可以由它的创建者、图空间管理员或系统管理员修改和删除。
2.0.10 创建 schema 模板 Params 路径参数说明:
请求体说明:
name: 模板名称,必填 schema: Gremlin schema 脚本,必填 Method & Url POST http://localhost:8080/graphspaces/gs1/schematemplatesRequest Body {
"name" : "template1" ,
"schema" : "schema.propertyKey('name').asText().ifNotExist().create();"
} Response Status Response Body {
"name" : "template1" ,
"schema" : "schema.propertyKey('name').asText().ifNotExist().create();" ,
"creator" : "admin" ,
"create" : "2024-05-01 12:00:00.000" ,
"create_time" : "2024-05-01 12:00:00.000" ,
"update" : "2024-05-01 12:00:00.000" ,
"update_time" : "2024-05-01 12:00:00.000"
} 2.0.11 列出图空间的全部 schema 模板 Method & Url GET http://localhost:8080/graphspaces/gs1/schematemplatesResponse Status Response Body {
"schema_templates" : [
"template1"
]
} 2.0.12 查看某个 schema 模板 Method & Url GET http://localhost:8080/graphspaces/gs1/schematemplates/template1Response Status 2.0.13 修改某个 schema 模板 只能修改 schema,模板名称不可修改。
Method & Url PUT http://localhost:8080/graphspaces/gs1/schematemplates/template1Request Body {
"schema" : "schema.propertyKey('age').asInt().ifNotExist().create();"
} Response Status 2.0.14 删除某个 schema 模板 Method & Url DELETE http://localhost:8080/graphspaces/gs1/schematemplates/template1Response Status 1.2 - Schema API Schema(图模式)REST 接口:查询图的完整模式定义,包括属性键、顶点标签、边标签和索引标签的统一视图。
1.1 Schema HugeGraph 提供单一接口获取某个图的全部 Schema 信息,包括:PropertyKey、VertexLabel、EdgeLabel 和 IndexLabel。
Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/{graph_name}/schema
e.g: GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schemaResponse Status Response Body {
"propertykeys" : [
{
"id" : 7 ,
"name" : "price" ,
"data_type" : "DOUBLE" ,
"cardinality" : "SINGLE" ,
"aggregate_type" : "NONE" ,
"write_type" : "OLTP" ,
"properties" : [],
"status" : "CREATED" ,
"user_data" : {
"~create_time" : "2023-05-08 17:49:05.316"
}
},
{
"id" : 6 ,
"name" : "date" ,
"data_type" : "TEXT" ,
"cardinality" : "SINGLE" ,
"aggregate_type" : "NONE" ,
"write_type" : "OLTP" ,
"properties" : [],
"status" : "CREATED" ,
"user_data" : {
"~create_time" : "2023-05-08 17:49:05.309"
}
},
{
"id" : 3 ,
"name" : "city" ,
"data_type" : "TEXT" ,
"cardinality" : "SINGLE" ,
"aggregate_type" : "NONE" ,
"write_type" : "OLTP" ,
"properties" : [],
"status" : "CREATED" ,
"user_data" : {
"~create_time" : "2023-05-08 17:49:05.287"
}
},
{
"id" : 2 ,
"name" : "age" ,
"data_type" : "INT" ,
"cardinality" : "SINGLE" ,
"aggregate_type" : "NONE" ,
"write_type" : "OLTP" ,
"properties" : [],
"status" : "CREATED" ,
"user_data" : {
"~create_time" : "2023-05-08 17:49:05.280"
}
},
{
"id" : 5 ,
"name" : "lang" ,
"data_type" : "TEXT" ,
"cardinality" : "SINGLE" ,
"aggregate_type" : "NONE" ,
"write_type" : "OLTP" ,
"properties" : [],
"status" : "CREATED" ,
"user_data" : {
"~create_time" : "2023-05-08 17:49:05.301"
}
},
{
"id" : 4 ,
"name" : "weight" ,
"data_type" : "DOUBLE" ,
"cardinality" : "SINGLE" ,
"aggregate_type" : "NONE" ,
"write_type" : "OLTP" ,
"properties" : [],
"status" : "CREATED" ,
"user_data" : {
"~create_time" : "2023-05-08 17:49:05.294"
}
},
{
"id" : 1 ,
"name" : "name" ,
"data_type" : "TEXT" ,
"cardinality" : "SINGLE" ,
"aggregate_type" : "NONE" ,
"write_type" : "OLTP" ,
"properties" : [],
"status" : "CREATED" ,
"user_data" : {
"~create_time" : "2023-05-08 17:49:05.250"
}
}
],
"vertexlabels" : [
{
"id" : 1 ,
"name" : "person" ,
"id_strategy" : "PRIMARY_KEY" ,
"primary_keys" : [
"name"
],
"nullable_keys" : [
"age" ,
"city"
],
"index_labels" : [
"personByAge" ,
"personByCity" ,
"personByAgeAndCity"
],
"properties" : [
"name" ,
"age" ,
"city"
],
"status" : "CREATED" ,
"ttl" : 0 ,
"enable_label_index" : true ,
"user_data" : {
"~create_time" : "2023-05-08 17:49:05.336"
}
},
{
"id" : 2 ,
"name" : "software" ,
"id_strategy" : "CUSTOMIZE_NUMBER" ,
"primary_keys" : [],
"nullable_keys" : [],
"index_labels" : [
"softwareByPrice"
],
"properties" : [
"name" ,
"lang" ,
"price"
],
"status" : "CREATED" ,
"ttl" : 0 ,
"enable_label_index" : true ,
"user_data" : {
"~create_time" : "2023-05-08 17:49:05.347"
}
}
],
"edgelabels" : [
{
"id" : 1 ,
"name" : "knows" ,
"source_label" : "person" ,
"target_label" : "person" ,
"frequency" : "SINGLE" ,
"sort_keys" : [],
"nullable_keys" : [],
"index_labels" : [
"knowsByWeight"
],
"properties" : [
"weight" ,
"date"
],
"status" : "CREATED" ,
"ttl" : 0 ,
"enable_label_index" : true ,
"user_data" : {
"~create_time" : "2023-05-08 17:49:08.437"
}
},
{
"id" : 2 ,
"name" : "created" ,
"source_label" : "person" ,
"target_label" : "software" ,
"frequency" : "SINGLE" ,
"sort_keys" : [],
"nullable_keys" : [],
"index_labels" : [
"createdByDate" ,
"createdByWeight"
],
"properties" : [
"weight" ,
"date"
],
"status" : "CREATED" ,
"ttl" : 0 ,
"enable_label_index" : true ,
"user_data" : {
"~create_time" : "2023-05-08 17:49:08.446"
}
}
],
"indexlabels" : [
{
"id" : 1 ,
"name" : "personByAge" ,
"base_type" : "VERTEX_LABEL" ,
"base_value" : "person" ,
"index_type" : "RANGE_INT" ,
"fields" : [
"age"
],
"status" : "CREATED" ,
"user_data" : {
"~create_time" : "2023-05-08 17:49:05.375"
}
},
{
"id" : 2 ,
"name" : "personByCity" ,
"base_type" : "VERTEX_LABEL" ,
"base_value" : "person" ,
"index_type" : "SECONDARY" ,
"fields" : [
"city"
],
"status" : "CREATED" ,
"user_data" : {
"~create_time" : "2023-05-08 17:49:06.898"
}
},
{
"id" : 3 ,
"name" : "personByAgeAndCity" ,
"base_type" : "VERTEX_LABEL" ,
"base_value" : "person" ,
"index_type" : "SECONDARY" ,
"fields" : [
"age" ,
"city"
],
"status" : "CREATED" ,
"user_data" : {
"~create_time" : "2023-05-08 17:49:07.407"
}
},
{
"id" : 4 ,
"name" : "softwareByPrice" ,
"base_type" : "VERTEX_LABEL" ,
"base_value" : "software" ,
"index_type" : "RANGE_DOUBLE" ,
"fields" : [
"price"
],
"status" : "CREATED" ,
"user_data" : {
"~create_time" : "2023-05-08 17:49:07.916"
}
},
{
"id" : 5 ,
"name" : "createdByDate" ,
"base_type" : "EDGE_LABEL" ,
"base_value" : "created" ,
"index_type" : "SECONDARY" ,
"fields" : [
"date"
],
"status" : "CREATED" ,
"user_data" : {
"~create_time" : "2023-05-08 17:49:08.454"
}
},
{
"id" : 6 ,
"name" : "createdByWeight" ,
"base_type" : "EDGE_LABEL" ,
"base_value" : "created" ,
"index_type" : "RANGE_DOUBLE" ,
"fields" : [
"weight"
],
"status" : "CREATED" ,
"user_data" : {
"~create_time" : "2023-05-08 17:49:08.963"
}
},
{
"id" : 7 ,
"name" : "knowsByWeight" ,
"base_type" : "EDGE_LABEL" ,
"base_value" : "knows" ,
"index_type" : "RANGE_DOUBLE" ,
"fields" : [
"weight"
],
"status" : "CREATED" ,
"user_data" : {
"~create_time" : "2023-05-08 17:49:09.473"
}
}
]
} 1.3 - PropertyKey API PropertyKey(属性键)REST 接口:定义图中所有属性的数据类型和基数约束,是构建图模式的基础元素。
1.2 PropertyKey Params 说明:
name:属性类型名称,必填 data_type:属性类型数据类型,包括:bool、byte、int、long、float、double、text、date、uuid、blob,默认 text 类型 (代表 string 字符串类型) cardinality:属性类型基数,包括:single、list、set,默认 single (代表单属性值) 请求体字段说明:
id:属性类型 id 值 properties:属性的属性,对于属性而言,此项为空 user_data:设置属性类型的通用信息,比如可设置 age 属性的取值范围,最小为 0,最大为 100;目前此项不做任何校验,只为后期拓展提供预留入口 1.2.1 创建一个 PropertyKey Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/propertykeys Request Body {
"name" : "age" ,
"data_type" : "INT" ,
"cardinality" : "SINGLE"
} Response Status Response Body {
"property_key" : {
"id" : 1 ,
"name" : "age" ,
"data_type" : "INT" ,
"cardinality" : "SINGLE" ,
"aggregate_type" : "NONE" ,
"write_type" : "OLTP" ,
"properties" : [],
"status" : "CREATED" ,
"user_data" : {
"~create_time" : "2022-05-13 13:47:23.745"
}
},
"task_id" : 0
} 1.2.2 为已存在的 PropertyKey 添加或移除 userdata Params action: 表示当前行为是添加还是移除,取值为append(添加)和eliminate(移除) Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/propertykeys/age?action=append Request Body {
"name" : "age" ,
"user_data" : {
"min" : 0 ,
"max" : 100
}
} Response Status Response Body {
"property_key" : {
"id" : 1 ,
"name" : "age" ,
"data_type" : "INT" ,
"cardinality" : "SINGLE" ,
"aggregate_type" : "NONE" ,
"write_type" : "OLTP" ,
"properties" : [],
"status" : "CREATED" ,
"user_data" : {
"min" : 0 ,
"max" : 100 ,
"~create_time" : "2022-05-13 13:47:23.745"
}
},
"task_id" : 0
} 1.2.3 获取所有的 PropertyKey Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/propertykeysResponse Status Response Body {
"propertykeys" : [
{
"id" : 3 ,
"name" : "city" ,
"data_type" : "TEXT" ,
"cardinality" : "SINGLE" ,
"properties" : [],
"user_data" : {}
},
{
"id" : 2 ,
"name" : "age" ,
"data_type" : "INT" ,
"cardinality" : "SINGLE" ,
"properties" : [],
"user_data" : {}
},
{
"id" : 5 ,
"name" : "lang" ,
"data_type" : "TEXT" ,
"cardinality" : "SINGLE" ,
"properties" : [],
"user_data" : {}
},
{
"id" : 4 ,
"name" : "weight" ,
"data_type" : "DOUBLE" ,
"cardinality" : "SINGLE" ,
"properties" : [],
"user_data" : {}
},
{
"id" : 6 ,
"name" : "date" ,
"data_type" : "TEXT" ,
"cardinality" : "SINGLE" ,
"properties" : [],
"user_data" : {}
},
{
"id" : 1 ,
"name" : "name" ,
"data_type" : "TEXT" ,
"cardinality" : "SINGLE" ,
"properties" : [],
"user_data" : {}
},
{
"id" : 7 ,
"name" : "price" ,
"data_type" : "INT" ,
"cardinality" : "SINGLE" ,
"properties" : [],
"user_data" : {}
}
]
} 1.2.4 根据 name 获取 PropertyKey Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/propertykeys/age 其中,age为要获取的 PropertyKey 的名称
Response Status Response Body {
"id" : 1 ,
"name" : "age" ,
"data_type" : "INT" ,
"cardinality" : "SINGLE" ,
"aggregate_type" : "NONE" ,
"write_type" : "OLTP" ,
"properties" : [],
"status" : "CREATED" ,
"user_data" : {
"min" : 0 ,
"max" : 100 ,
"~create_time" : "2022-05-13 13:47:23.745"
}
} 1.2.5 根据 name 删除 PropertyKey Method & Url DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/propertykeys/age 其中,age为要删除的 PropertyKey 的名称
Response Status Response Body 1.4 - VertexLabel API VertexLabel(顶点标签)REST 接口:定义顶点类型、ID策略及关联的属性,决定顶点的结构和约束规则。
1.3 VertexLabel 假设已经创建好了 1.1.3 中列出来的 PropertyKeys
Params 说明
id:顶点类型 id 值 name:顶点类型名称,必填 id_strategy: 顶点类型的 ID 策略,主键 ID、自动生成、自定义字符串、自定义数字、自定义 UUID,默认主键 ID properties: 顶点类型关联的属性类型 primary_keys: 主键属性,当 ID 策略为 PRIMARY_KEY 时必须有值,其他 ID 策略时必须为空; enable_label_index:是否开启类型索引,默认关闭 index_names:顶点类型创建的索引,详情见 3.4 nullable_keys:可为空的属性 user_data:设置顶点类型的通用信息,作用同属性类型 1.3.1 创建一个 VertexLabel Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/vertexlabelsRequest Body {
"name" : "person" ,
"id_strategy" : "DEFAULT" ,
"properties" : [
"name" ,
"age"
],
"primary_keys" : [
"name"
],
"nullable_keys" : [],
"enable_label_index" : true
} Response Status Response Body {
"id" : 1 ,
"primary_keys" : [
"name"
],
"id_strategy" : "PRIMARY_KEY" ,
"name" : "person2" ,
"index_names" : [
],
"properties" : [
"name" ,
"age"
],
"nullable_keys" : [
],
"enable_label_index" : true ,
"user_data" : {}
} 从 hugegraph-server v0.11.2 版本开始支持顶点的 TTL 功能。顶点的 TTL 是通过 VertexLabel 来设置的。比如希望 person 类型的顶点存活时间为一天,需要在创建 person VertexLabel 的时候将 TTL 字段设置为 86400000,即单位为毫秒。
{
"name" : "person" ,
"id_strategy" : "DEFAULT" ,
"properties" : [
"name" ,
"age"
],
"primary_keys" : [
"name"
],
"nullable_keys" : [],
"ttl" : 86400000 ,
"enable_label_index" : true
} 另外,当顶点中带有"创建时间"的属性且希望以"创建时间"属性作为计算顶点存活时间的起点时,可以设置 VertexLabel 中的 ttl_start_time 字段。比如 person VertexLabel 有 createdTime 属性,且 createdTime 是 Date 类型的参数,希望 person 类型的顶点从创建开始存活一天的时间,那么创建 person VertexLabel 的 Request Body 如下:
{
"name" : "person" ,
"id_strategy" : "DEFAULT" ,
"properties" : [
"name" ,
"age" ,
"createdTime"
],
"primary_keys" : [
"name"
],
"nullable_keys" : [],
"ttl" : 86400000 ,
"ttl_start_time" : "createdTime" ,
"enable_label_index" : true
} 1.3.2 为已存在的 VertexLabel 添加 properties 或 userdata,或者移除 userdata(目前不支持移除 properties) Params action: 表示当前行为是添加还是移除,取值为append(添加)和eliminate(移除) Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/vertexlabels/person?action=appendRequest Body {
"name" : "person" ,
"properties" : [
"city"
],
"nullable_keys" : [ "city" ],
"user_data" : {
"super" : "animal"
}
} Response Status Response Body {
"id" : 1 ,
"primary_keys" : [
"name"
],
"id_strategy" : "PRIMARY_KEY" ,
"name" : "person" ,
"index_names" : [
],
"properties" : [
"city" ,
"name" ,
"age"
],
"nullable_keys" : [
"city"
],
"enable_label_index" : true ,
"user_data" : {
"super" : "animal"
}
} 1.3.3 获取所有的 VertexLabel Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/vertexlabelsResponse Status Response Body {
"vertexlabels" : [
{
"id" : 1 ,
"primary_keys" : [
"name"
],
"id_strategy" : "PRIMARY_KEY" ,
"name" : "person" ,
"index_names" : [
],
"properties" : [
"city" ,
"name" ,
"age"
],
"nullable_keys" : [
"city"
],
"enable_label_index" : true ,
"user_data" : {
"super" : "animal"
}
},
{
"id" : 2 ,
"primary_keys" : [
"name"
],
"id_strategy" : "PRIMARY_KEY" ,
"name" : "software" ,
"index_names" : [
],
"properties" : [
"price" ,
"name" ,
"lang"
],
"nullable_keys" : [
"price"
],
"enable_label_index" : false ,
"user_data" : {}
}
]
} 1.3.4 根据 name 获取 VertexLabel Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/vertexlabels/personResponse Status Response Body {
"id" : 1 ,
"primary_keys" : [
"name"
],
"id_strategy" : "PRIMARY_KEY" ,
"name" : "person" ,
"index_names" : [
],
"properties" : [
"city" ,
"name" ,
"age"
],
"nullable_keys" : [
"city"
],
"enable_label_index" : true ,
"user_data" : {
"super" : "animal"
}
} 1.3.5 根据 name 删除 VertexLabel 删除 VertexLabel 会导致删除对应的顶点以及相关的索引数据,会产生一个异步任务
Method & Url DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/vertexlabels/personResponse Status Response Body 注:
可以通过GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1(其中"1"是 task_id)来查询异步任务的执行状态,更多异步任务 RESTful API
1.5 - EdgeLabel API EdgeLabel(边标签)REST 接口:定义边类型、源顶点和目标顶点的关系约束,构建图的连接规则。
1.4 EdgeLabel 假设已经创建好了 1.2.3 中的 PropertyKeys 和 1.3.3 中的 VertexLabels
Params 说明
name:顶点类型名称,必填 source_label: 源顶点类型的名称,必填 target_label: 目标顶点类型的名称,必填 frequency:两个点之间是否可以有多条边,可以取值 SINGLE 和 MULTIPLE,非必填,默认值 SINGLE properties: 边类型关联的属性类型,选填 sort_keys: 当允许关联多次时,指定区分键属性列表 nullable_keys:可为空的属性,选填,默认可为空 enable_label_index:是否开启类型索引,默认关闭 1.4.1 创建一个 EdgeLabel Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/edgelabelsRequest Body {
"name" : "created" ,
"source_label" : "person" ,
"target_label" : "software" ,
"frequency" : "SINGLE" ,
"properties" : [
"date"
],
"sort_keys" : [],
"nullable_keys" : [],
"enable_label_index" : true
} Response Status Response Body {
"id" : 1 ,
"sort_keys" : [
],
"source_label" : "person" ,
"name" : "created" ,
"index_names" : [
],
"properties" : [
"date"
],
"target_label" : "software" ,
"frequency" : "SINGLE" ,
"nullable_keys" : [
],
"enable_label_index" : true ,
"user_data" : {}
} 从 hugegraph-server v0.11.2 版本开始支持边的 TTL 功能。边的 TTL 是通过 EdgeLabel 来设置的。比如希望 knows 类型的边存活时间为一天,需要在创建 knows EdgeLabel 的时候将 TTL 字段设置为 86400000,即单位为毫秒。
{
"id" : 1 ,
"sort_keys" : [
],
"source_label" : "person" ,
"name" : "knows" ,
"index_names" : [
],
"properties" : [
"date" ,
"createdTime"
],
"target_label" : "person" ,
"frequency" : "SINGLE" ,
"nullable_keys" : [
],
"enable_label_index" : true ,
"ttl" : 86400000 ,
"user_data" : {}
} 另外,当边中带有"创建时间"的属性且希望以"创建时间"属性作为计算边存活时间的起点时,可以设置 EdgeLabel 中的 ttl_start_time 字段。比如 knows EdgeLabel 有 createdTime 属性,且 createdTime 是 Date 类型的参数,希望 knows 类型的边从创建开始存活一天的时间,那么创建 knows EdgeLabel 的 Request Body 如下:
{
"id" : 1 ,
"sort_keys" : [
],
"source_label" : "person" ,
"name" : "knows" ,
"index_names" : [
],
"properties" : [
"date" ,
"createdTime"
],
"target_label" : "person" ,
"frequency" : "SINGLE" ,
"nullable_keys" : [
],
"enable_label_index" : true ,
"ttl" : 86400000 ,
"ttl_start_time" : "createdTime" ,
"user_data" : {}
} 1.4.2 为已存在的 EdgeLabel 添加 properties 或 userdata,或者移除 userdata(目前不支持移除 properties) Params action: 表示当前行为是添加还是移除,取值为append(添加)和eliminate(移除) Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/edgelabels/created?action=appendRequest Body {
"name" : "created" ,
"properties" : [
"weight"
],
"nullable_keys" : [
"weight"
]
} Response Status Response Body {
"id" : 2 ,
"sort_keys" : [
],
"source_label" : "person" ,
"name" : "created" ,
"index_names" : [
],
"properties" : [
"date" ,
"weight"
],
"target_label" : "software" ,
"frequency" : "SINGLE" ,
"nullable_keys" : [
"weight"
],
"enable_label_index" : true ,
"user_data" : {}
} 1.4.3 获取所有的 EdgeLabel Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/edgelabelsResponse Status Response Body {
"edgelabels" : [
{
"id" : 1 ,
"sort_keys" : [
],
"source_label" : "person" ,
"name" : "created" ,
"index_names" : [
],
"properties" : [
"date" ,
"weight"
],
"target_label" : "software" ,
"frequency" : "SINGLE" ,
"nullable_keys" : [
"weight"
],
"enable_label_index" : true ,
"user_data" : {}
},
{
"id" : 2 ,
"sort_keys" : [
],
"source_label" : "person" ,
"name" : "knows" ,
"index_names" : [
],
"properties" : [
"date" ,
"weight"
],
"target_label" : "person" ,
"frequency" : "SINGLE" ,
"nullable_keys" : [
],
"enable_label_index" : false ,
"user_data" : {}
}
]
} 1.4.4 根据 name 获取 EdgeLabel Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/edgelabels/createdResponse Status Response Body {
"id" : 1 ,
"sort_keys" : [
],
"source_label" : "person" ,
"name" : "created" ,
"index_names" : [
],
"properties" : [
"date" ,
"city" ,
"weight"
],
"target_label" : "software" ,
"frequency" : "SINGLE" ,
"nullable_keys" : [
"city" ,
"weight"
],
"enable_label_index" : true ,
"user_data" : {}
} 1.4.5 根据 name 删除 EdgeLabel 删除 EdgeLabel 会导致删除对应的边以及相关的索引数据,会产生一个异步任务
Method & Url DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/edgelabels/createdResponse Status Response Body 注:
可以通过GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1(其中"1"是 task_id)来查询异步任务的执行状态,更多异步任务 RESTful API
1.6 - IndexLabel API IndexLabel(索引标签)REST 接口:为顶点和边的属性创建索引,加速基于属性的查询和过滤操作。
1.5 IndexLabel 假设已经创建好了 1.1.3 中的 PropertyKeys、1.2.3 中的 VertexLabels 以及 1.3.3 中的 EdgeLabels
1.5.1 创建一个 IndexLabel Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/indexlabels Request Body {
"name" : "personByCity" ,
"base_type" : "VERTEX_LABEL" ,
"base_value" : "person" ,
"index_type" : "SECONDARY" ,
"fields" : [
"city"
]
} Response Status Response Body {
"index_label" : {
"id" : 1 ,
"base_type" : "VERTEX_LABEL" ,
"base_value" : "person" ,
"name" : "personByCity" ,
"fields" : [
"city"
],
"index_type" : "SECONDARY"
},
"task_id" : 2
} 1.5.2 获取所有的 IndexLabel Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/indexlabelsResponse Status Response Body {
"indexlabels" : [
{
"id" : 3 ,
"base_type" : "VERTEX_LABEL" ,
"base_value" : "software" ,
"name" : "softwareByPrice" ,
"fields" : [
"price"
],
"index_type" : "RANGE"
},
{
"id" : 4 ,
"base_type" : "EDGE_LABEL" ,
"base_value" : "created" ,
"name" : "createdByDate" ,
"fields" : [
"date"
],
"index_type" : "SECONDARY"
},
{
"id" : 1 ,
"base_type" : "VERTEX_LABEL" ,
"base_value" : "person" ,
"name" : "personByCity" ,
"fields" : [
"city"
],
"index_type" : "SECONDARY"
},
{
"id" : 3 ,
"base_type" : "VERTEX_LABEL" ,
"base_value" : "person" ,
"name" : "personByAgeAndCity" ,
"fields" : [
"age" ,
"city"
],
"index_type" : "SECONDARY"
}
]
} 1.5.3 根据 name 获取 IndexLabel Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/indexlabels/personByCityResponse Status Response Body {
"id" : 1 ,
"base_type" : "VERTEX_LABEL" ,
"base_value" : "person" ,
"name" : "personByCity" ,
"fields" : [
"city"
],
"index_type" : "SECONDARY"
} 1.5.4 根据 name 删除 IndexLabel 删除 IndexLabel 会导致删除相关的索引数据,会产生一个异步任务
Method & Url DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/indexlabels/personByCityResponse Status Response Body 注:
可以通过GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1(其中"1"是 task_id)来查询异步任务的执行状态,更多异步任务 RESTful API
1.5.5 为已存在的 IndexLabel 添加或移除 userdata 该方式只能修改 user_data,请求体中不能带 base_type、base_value 和 index_type。
Params action: 表示当前行为是添加还是移除,取值为 append(添加)和 eliminate(移除) Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/indexlabels/personByCity?action=appendRequest Body {
"name" : "personByCity" ,
"user_data" : {
"comment" : "index on city"
}
} Response Status Response Body {
"id" : 1 ,
"base_type" : "VERTEX_LABEL" ,
"base_value" : "person" ,
"name" : "personByCity" ,
"fields" : [
"city"
],
"index_type" : "SECONDARY" ,
"user_data" : {
"comment" : "index on city" ,
"~create_time" : "2022-05-13 13:47:23.745"
}
} 1.7 - Rebuild API Rebuild(重建索引)REST 接口:重建图模式的索引,确保索引数据与图数据保持一致性。
1.6 Rebuild 1.6.1 重建 IndexLabel Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/rebuild/indexlabels/personByCityResponse Status Response Body 注:
可以通过GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1(其中"1"是 task_id)来查询异步任务的执行状态,更多异步任务 RESTful API
1.6.2 VertexLabel 对应的全部索引重建 Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/rebuild/vertexlabels/person Response Status Response Body 注:
可以通过GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/2(其中"2"是 task_id)来查询异步任务的执行状态,更多异步任务 RESTful API
1.6.3 EdgeLabel 对应的全部索引重建 Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/rebuild/edgelabels/created Response Status Response Body 注:
可以通过GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/3(其中"3"是 task_id)来查询异步任务的执行状态,更多异步任务 RESTful API
1.8 - Vertex API Vertex(顶点)REST 接口:创建、查询、更新和删除图中的顶点数据,支持批量操作和条件过滤。
2.1 Vertex 顶点类型中的 Id 策略决定了顶点的 Id 类型,其对应的 id 类型如下:
顶点的 GET/PUT/DELETE API 中 url 的 id 部分应该传入带有类型信息的 id 值,这个类型信息通过 json 串是否带引号来表示,也就是说:
当 id 类型为 number 时,url 中的 id 不带引号,例如 xxx/vertices/123456 当 id 类型为 string 时,url 中的 id 带引号,例如 xxx/vertices/"123456" 接下来的示例需要先根据以下 groovy 脚本创建图 schema
schema . propertyKey ( "name" ). asText (). ifNotExist (). create ();
schema . propertyKey ( "age" ). asInt (). ifNotExist (). create ();
schema . propertyKey ( "city" ). asText (). ifNotExist (). create ();
schema . propertyKey ( "weight" ). asDouble (). ifNotExist (). create ();
schema . propertyKey ( "lang" ). asText (). ifNotExist (). create ();
schema . propertyKey ( "price" ). asDouble (). ifNotExist (). create ();
schema . propertyKey ( "hobby" ). asText (). valueList (). ifNotExist (). create ();
schema . vertexLabel ( "person" ). properties ( "name" , "age" , "city" , "weight" , "hobby" ). primaryKeys ( "name" ). nullableKeys ( "age" , "city" , "weight" , "hobby" ). ifNotExist (). create ();
schema . vertexLabel ( "software" ). properties ( "name" , "lang" , "price" ). primaryKeys ( "name" ). nullableKeys ( "lang" , "price" ). ifNotExist (). create ();
schema . indexLabel ( "personByAge" ). onV ( "person" ). by ( "age" ). range (). ifNotExist (). create (); 2.1.1 创建一个顶点 Params 路径参数说明:
graphspace: 图空间名称 graph: 图名称 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/verticesRequest Body {
"label" : "person" ,
"properties" : {
"name" : "marko" ,
"age" : 29
}
} Response Status Response Body {
"id" : "1:marko" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "marko" ,
"age" : 29
}
} 2.1.2 创建多个顶点 Params 路径参数说明:
graphspace: 图空间名称 graph: 图名称 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/vertices/batchRequest Body [
{
"label" : "person" ,
"properties" : {
"name" : "marko" ,
"age" : 29
}
},
{
"label" : "software" ,
"properties" : {
"name" : "ripple" ,
"lang" : "java" ,
"price" : 199
}
}
] Response Status Response Body [
"1:marko" ,
"2:ripple"
] 2.1.3 更新顶点属性 Params 路径参数说明:
graphspace: 图空间名称 graph: 图名称 id: 顶点 id,需要包含引号,例如"1:marko" Method & Url PUT http://127.0.0.1:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/vertices/"1:marko"?action=appendRequest Body {
"label" : "person" ,
"properties" : {
"age" : 30 ,
"city" : "Beijing"
}
} 注意:属性的取值有三种类别,分别为 single、set 和 list。single 表示增加或更新属性值,set 或 list 表示追加属性值。
Response Status Response Body {
"id" : "1:marko" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "marko" ,
"age" : 30 ,
"city" : "Beijing"
}
} 2.1.4 批量更新顶点属性 功能说明 批量更新顶点的属性时,可以选择多种更新策略,如下:
SUM: 数值累加 BIGGER: 原值和新值 (数字、日期) 取更大的 SMALLER: 原值和新值 (数字、日期) 取更小的 UNION: Set 属性取并集 INTERSECTION: Set 属性取交集 APPEND: List 属性追加元素 ELIMINATE: List/Set属性删除元素 OVERRIDE: 覆盖已有属性,如果新属性为 null,则仍然使用旧属性 假设原顶点的属性如下:
{
"vertices" : [
{
"id" : "2:lop" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" : {
"name" : "lop" ,
"lang" : "java" ,
"price" : 328
}
},
{
"id" : "1:josh" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "josh" ,
"age" : 32 ,
"city" : "Beijing" ,
"weight" : 0.1 ,
"hobby" : [
"reading" ,
"football"
]
}
}
]
} 通过以下命令新增顶点:
curl -H "Content-Type: application/json" -d '[{"label":"person","properties":{"name":"josh","age":32,"city":"Beijing","weight":0.1,"hobby":["reading","football"]}},{"label":"software","properties":{"name":"lop","lang":"java","price":328}}]' http://127.0.0.1:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/vertices/batch Params 路径参数说明:
graphspace: 图空间名称 graph: 图名称 Method & Url PUT http://127.0.0.1:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/vertices/batchRequest Body {
"vertices" : [
{
"label" : "software" ,
"type" : "vertex" ,
"properties" : {
"name" : "lop" ,
"lang" : "c++" ,
"price" : 299
}
},
{
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "josh" ,
"city" : "Shanghai" ,
"weight" : 0.2 ,
"hobby" : [
"swimming"
]
}
}
],
"update_strategies" : {
"price" : "BIGGER" ,
"age" : "OVERRIDE" ,
"city" : "OVERRIDE" ,
"weight" : "SUM" ,
"hobby" : "UNION"
},
"create_if_not_exist" : true
} Response Status Response Body {
"vertices" : [
{
"id" : "2:lop" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" : {
"name" : "lop" ,
"lang" : "c++" ,
"price" : 328
}
},
{
"id" : "1:josh" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "josh" ,
"age" : 32 ,
"city" : "Shanghai" ,
"weight" : 0.3 ,
"hobby" : [
"reading" ,
"football" ,
"swimming"
]
}
}
]
} 结果分析如下:
lang 属性未指定更新策略,直接用新值覆盖旧值,无论新值是否为 null; price 属性指定 BIGGER 的更新策略,旧属性值为 328,新属性值为 299,所以仍然保留了旧属性值 328; age 属性指定 OVERRIDE 更新策略,而新属性值中未传入 age,相当于 age 为 null,所以仍然保留了原属性值 32; city 属性也指定了 OVERRIDE 更新策略,且新属性值不为 null,所以覆盖了旧值; weight 属性指定了 SUM 更新策略,旧属性值为 0.1,新属性值为 0.2,最后的值为 0.3; hobby 属性(基数为 Set)指定了 UNION 更新策略,所以新值与旧值取了并集; 其他更新策略的使用方式与此类似,此处不再详述。
2.1.5 删除顶点属性 Params 路径参数说明:
graphspace: 图空间名称 graph: 图名称 id: 顶点 id,需要包含引号,例如"1:marko" Method & Url PUT http://127.0.0.1:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/vertices/"1:marko"?action=eliminateRequest Body {
"label" : "person" ,
"properties" : {
"city" : "Beijing"
}
} 注意:这里会直接删除属性(删除 key 和所有 value),无论其属性的取值是 single、set 或 list。
Response Status Response Body {
"id" : "1:marko" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "marko" ,
"age" : 30
}
} 2.1.6 获取符合条件的顶点 Params 路径参数说明:
graphspace: 图空间名称 graph: 图名称 请求参数说明:
label: 顶点的类型 properties: 属性键值对(查询属性的前提是该属性已经建立了索引) keep_start_p: 默认为 false,设置为 true 时不会自动转义范围匹配表达式,例如 properties={"age":"P.gt(18)"} 会被当作精确匹配,即 age 属性等于字符串 “P.gt(18)” offset: 偏移量,默认为 0 limit: 查询结果的最大数目,默认为 100 page: 分页的页号 以上参数都是可选的,page 不能与非 0 的 offset 同时使用,其余参数之间可以任意组合。
属性键值对由属性名称和属性值组成 JSON 格式的对象,可以使用多个属性键值对作为查询条件,属性值支持精确匹配和范围匹配,精确匹配的形式如properties={"age":29},范围匹配的形式如properties={"age":"P.gt(29)"},范围匹配支持以下表达式:
查询所有 age 为 29 且 label 为 person 的顶点
Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/vertices?label=person&properties={"age":29}&limit=1Response Status Response Body {
"vertices" : [
{
"id" : "1:marko" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "marko" ,
"age" : 30
}
}
]
} 分页查询所有顶点,获取第一页(page 不带参数值),限定 3 条
通过以下命令新增顶点:
curl -H "Content-Type: application/json" -d '[{"label":"person","properties":{"name":"peter","age":29,"city":"Shanghai"}},{"label":"person","properties":{"name":"vadas","age":27,"city":"Hongkong"}}]' http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/vertices/batch Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/vertices?page&limit=3Response Status Response Body {
"vertices" : [
{
"id" : "2:lop" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" : {
"name" : "lop" ,
"lang" : "c++" ,
"price" : 328
}
},
{
"id" : "1:josh" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "josh" ,
"age" : 32 ,
"city" : "Shanghai" ,
"weight" : 0.3 ,
"hobby" : [
"reading" ,
"football" ,
"swimming"
]
}
},
{
"id" : "1:marko" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "marko" ,
"age" : 30
}
}
],
"page" : "CIYxOnBldGVyAAAAAAAAAAM="
} 返回的 body 里面是带有下一页的页号信息的,"page": "CIYxOnBldGVyAAAAAAAAAAM=",在查询下一页的时候将该值赋给 page 参数。
分页查询所有顶点,获取下一页(page 带上上一页返回的 page 值),限定 3 条
Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/vertices?page=CIYxOnBldGVyAAAAAAAAAAM=&limit=3Response Status Response Body {
"vertices" : [
{
"id" : "1:peter" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "peter" ,
"age" : 29 ,
"city" : "Shanghai"
}
},
{
"id" : "1:vadas" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "vadas" ,
"age" : 27 ,
"city" : "Hongkong"
}
},
{
"id" : "2:ripple" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" : {
"name" : "ripple" ,
"lang" : "java" ,
"price" : 199
}
}
],
"page" : null
} 当"page": null时,表示已经没有下一页了(注:如果后端使用的是 Cassandra,为了提高性能,当返回的页数刚好是最后一页时,返回的 page 值可能不为空,但是如果用这个 page 值再请求下一页数据时,就会返回 空数据 和 page = null,其他情况也类似)
2.1.7 根据 Id 获取顶点 Params 路径参数说明:
graphspace: 图空间名称 graph: 图名称 id: 顶点 id,需要包含引号,例如"1:marko" Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/vertices/"1:marko"Response Status Response Body {
"id" : "1:marko" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "marko" ,
"age" : 30
}
} 2.1.8 根据 Id 删除顶点 Params 路径参数说明:
graphspace: 图空间名称 graph: 图名称 id: 顶点 id,需要包含引号,例如"1:marko" 请求参数说明:
仅根据 Id 删除顶点
Method & Url DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/vertices/"1:marko"Response Status 根据 Label+Id 删除顶点
通过指定 Label 参数和 Id 来删除顶点时,一般来说其性能比仅根据 Id 删除会更好。
Method & Url DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/vertices/"1:marko"?label=personResponse Status 1.9 - Edge API Edge(边)REST 接口:创建、查询、更新和删除顶点之间的关系数据,支持批量操作和方向查询。
2.2 Edge 顶点 id 格式的修改也影响到了边的 id 以及源顶点和目标顶点 id 的格式
EdgeId 是由 src-vertex-id + direction + label + sort-values + tgt-vertex-id 拼接而成,但是这里的顶点 id 类型不是通过引号区分的,而是根据前缀区分:
当 id 类型为 number 时,EdgeId 的顶点 id 前有一个前缀 L ,形如 “L123456>1»L987654” 当 id 类型为 string 时,EdgeId 的顶点 id 前有一个前缀 S ,形如 “S1:peter>1»S2:lop” 接下来的示例需要先根据以下 groovy 脚本创建图 schema
import org.apache.hugegraph.HugeFactory
import org.apache.tinkerpop.gremlin.structure.T
conf = "conf/graphs/hugegraph.properties"
graph = HugeFactory . open ( conf )
schema = graph . schema ()
schema . propertyKey ( "name" ). asText (). ifNotExist (). create ()
schema . propertyKey ( "age" ). asInt (). ifNotExist (). create ()
schema . propertyKey ( "city" ). asText (). ifNotExist (). create ()
schema . propertyKey ( "weight" ). asDouble (). ifNotExist (). create ()
schema . propertyKey ( "lang" ). asText (). ifNotExist (). create ()
schema . propertyKey ( "date" ). asText (). ifNotExist (). create ()
schema . propertyKey ( "price" ). asInt (). ifNotExist (). create ()
schema . vertexLabel ( "person" ). properties ( "name" , "age" , "city" ). primaryKeys ( "name" ). ifNotExist (). create ()
schema . vertexLabel ( "software" ). properties ( "name" , "lang" , "price" ). primaryKeys ( "name" ). ifNotExist (). create ()
schema . indexLabel ( "personByCity" ). onV ( "person" ). by ( "city" ). secondary (). ifNotExist (). create ()
schema . indexLabel ( "personByAgeAndCity" ). onV ( "person" ). by ( "age" , "city" ). secondary (). ifNotExist (). create ()
schema . indexLabel ( "softwareByPrice" ). onV ( "software" ). by ( "price" ). range (). ifNotExist (). create ()
schema . edgeLabel ( "knows" ). sourceLabel ( "person" ). targetLabel ( "person" ). properties ( "date" , "weight" ). ifNotExist (). create ()
schema . edgeLabel ( "created" ). sourceLabel ( "person" ). targetLabel ( "software" ). properties ( "date" , "weight" ). ifNotExist (). create ()
schema . indexLabel ( "createdByDate" ). onE ( "created" ). by ( "date" ). secondary (). ifNotExist (). create ()
schema . indexLabel ( "createdByWeight" ). onE ( "created" ). by ( "weight" ). range (). ifNotExist (). create ()
schema . indexLabel ( "knowsByWeight" ). onE ( "knows" ). by ( "weight" ). range (). ifNotExist (). create ()
marko = graph . addVertex ( T . label , "person" , "name" , "marko" , "age" , 29 , "city" , "Beijing" )
vadas = graph . addVertex ( T . label , "person" , "name" , "vadas" , "age" , 27 , "city" , "Hongkong" )
lop = graph . addVertex ( T . label , "software" , "name" , "lop" , "lang" , "java" , "price" , 328 )
josh = graph . addVertex ( T . label , "person" , "name" , "josh" , "age" , 32 , "city" , "Beijing" )
ripple = graph . addVertex ( T . label , "software" , "name" , "ripple" , "lang" , "java" , "price" , 199 )
peter = graph . addVertex ( T . label , "person" , "name" , "peter" , "age" , 35 , "city" , "Shanghai" )
graph . tx (). commit ()
g = graph . traversal () 2.2.1 创建一条边 Params 路径参数说明:
graphspace: 图空间名称 graph:待操作的图 请求体说明:
label:边类型名称,必填 outV:源顶点 id,必填 inV:目标顶点 id,必填 outVLabel:源顶点类型,必填 inVLabel:目标顶点类型,必填 properties: 边关联的属性,对象内部结构为:name:属性名称 value:属性值 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/edges Request Body {
"label" : "created" ,
"outV" : "1:marko" ,
"inV" : "2:lop" ,
"outVLabel" : "person" ,
"inVLabel" : "software" ,
"properties" : {
"date" : "20171210" ,
"weight" : 0.4
}
} Response Status Response Body {
"id" : "S1:marko>2>>S2:lop" ,
"label" : "created" ,
"type" : "edge" ,
"outV" : "1:marko" ,
"outVLabel" : "person" ,
"inV" : "2:lop" ,
"inVLabel" : "software" ,
"properties" : {
"weight" : 0.4 ,
"date" : "20171210"
}
} 2.2.2 创建多条边 Params 路径参数说明:
graphspace: 图空间名称 graph:待操作的图 请求参数说明:
check_vertex:是否检查顶点存在 (true | false),当设置为 true 而待插入边的源顶点或目标顶点不存在时会报错,默认为 true 请求体说明:
Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/edges/batch Request Body [
{
"label" : "knows" ,
"outV" : "1:marko" ,
"inV" : "1:vadas" ,
"outVLabel" : "person" ,
"inVLabel" : "person" ,
"properties" : {
"date" : "20160110" ,
"weight" : 0.5
}
},
{
"label" : "knows" ,
"outV" : "1:marko" ,
"inV" : "1:josh" ,
"outVLabel" : "person" ,
"inVLabel" : "person" ,
"properties" : {
"date" : "20130220" ,
"weight" : 1.0
}
}
] Response Status Response Body [
"S1:marko>1>>S1:vadas" ,
"S1:marko>1>>S1:josh"
] 2.2.3 更新边属性 Params 路径参数说明:
graphspace: 图空间名称 graph:待操作的图 id:待操作的边 id 请求参数说明:
请求体说明:
Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/edges/S1:marko>2>>S2:lop?action=append Request Body {
"properties" : {
"weight" : 1.0
}
} 注意:属性的取值是有三种类别的,分别是 single、set 和 list。如果是 single,表示增加或更新属性值;如果是 set 或 list,则表示追加属性值
Response Status Response Body {
"id" : "S1:marko>2>>S2:lop" ,
"label" : "created" ,
"type" : "edge" ,
"outV" : "1:marko" ,
"outVLabel" : "person" ,
"inV" : "2:lop" ,
"inVLabel" : "software" ,
"properties" : {
"weight" : 1.0 ,
"date" : "20171210"
}
} 2.2.4 批量更新边属性 Params 路径参数说明:
graphspace: 图空间名称 graph:待操作的图 请求体说明:
edges:边信息的列表 update_strategies:对于每个属性,可以单独设置其更新策略,包括:SUM:仅支持 number 类型 BIGGER/SMALLER:仅支持 date/number 类型 UNION/INTERSECTION:仅支持 set 类型 APPEND/ELIMINATE:仅支持 collection 类型 OVERRIDE check_vertex:是否检查顶点存在 (true | false),当设置为 true 而待插入边的源顶点或目标顶点不存在时会报错,默认为 true create_if_not_exist:目前只支持设定为 true Method & Url PUT http://127.0.0.1:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/edges/batch Request Body {
"edges" : [
{
"label" : "knows" ,
"outV" : "1:marko" ,
"inV" : "1:vadas" ,
"outVLabel" : "person" ,
"inVLabel" : "person" ,
"properties" : {
"date" : "20160111" ,
"weight" : 1.0
}
},
{
"label" : "knows" ,
"outV" : "1:marko" ,
"inV" : "1:josh" ,
"outVLabel" : "person" ,
"inVLabel" : "person" ,
"properties" : {
"date" : "20130221" ,
"weight" : 0.5
}
}
],
"update_strategies" : {
"weight" : "SUM" ,
"date" : "OVERRIDE"
},
"check_vertex" : false ,
"create_if_not_exist" : true
} Response Status Response Body {
"edges" : [
{
"id" : "S1:marko>1>>S1:vadas" ,
"label" : "knows" ,
"type" : "edge" ,
"outV" : "1:marko" ,
"outVLabel" : "person" ,
"inV" : "1:vadas" ,
"inVLabel" : "person" ,
"properties" : {
"weight" : 1.5 ,
"date" : "20160111"
}
},
{
"id" : "S1:marko>1>>S1:josh" ,
"label" : "knows" ,
"type" : "edge" ,
"outV" : "1:marko" ,
"outVLabel" : "person" ,
"inV" : "1:josh" ,
"inVLabel" : "person" ,
"properties" : {
"weight" : 1.5 ,
"date" : "20130221"
}
}
]
} 2.2.5 删除边属性 Params 路径参数说明:
graphspace: 图空间名称 graph:待操作的图 id:待操作的边 id 请求参数说明:
请求体说明:
Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/edges/S1:marko>2>>S2:lop?action=eliminate Request Body {
"properties" : {
"weight" : 1.0
}
} 注意:这里会直接删除属性(删除 key 和所有 value),无论其属性的取值是 single、set 或 list
Response Status Response Body 无法删除未设置为 nullable 的属性
{
"exception" : "class java.lang.IllegalArgumentException" ,
"message" : "Can't remove non-null edge property 'p[weight->1.0]'" ,
"cause" : ""
} 2.2.6 获取符合条件的边 Params 路径参数说明:
graphspace: 图空间名称 graph:待操作的图 请求参数说明:
vertex_id: 顶点 id direction: 边的方向 (OUT | IN | BOTH),默认为 BOTH label: 边的标签 properties: 属性键值对 (根据属性查询的前提是预先建立了索引) keep_start_p: 默认为 false,当设置为 true 后,不会自动转义范围匹配输入的表达式,例如此时 properties={"age":"P.gt(0.8)"} 会被理解为精确匹配,即 age 属性等于 “P.gt(0.8)” offset:偏移,默认为 0 limit: 查询数目,默认为 100 page: 页号 属性键值对由 JSON 格式的属性名称和属性值组成,允许多个属性键值对作为查询条件,属性值支持精确匹配和范围匹配,精确匹配时形如 properties={"weight":0.8},范围匹配时形如 properties={"age":"P.gt(0.8)"},范围匹配支持的表达式如下:
查询与顶点 person:marko(vertex_id=“1:marko”) 相连且 label 为 knows 的且 date 属性等于 “20160111” 的边
Method & Url GET http://127.0.0.1:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/edges?vertex_id="1:marko"&label=knows&properties={"date":"P.within(\"20160111\")"} Response Status Response Body {
"edges" : [
{
"id" : "S1:marko>1>>S1:vadas" ,
"label" : "knows" ,
"type" : "edge" ,
"outV" : "1:marko" ,
"outVLabel" : "person" ,
"inV" : "1:vadas" ,
"inVLabel" : "person" ,
"properties" : {
"weight" : 1.5 ,
"date" : "20160111"
}
}
]
} 分页查询所有边,获取第一页(page 不带参数值),限定 2 条
Method & Url GET http://127.0.0.1:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/edges?page&limit=2 Response Status Response Body {
"edges" : [
{
"id" : "S1:marko>1>>S1:josh" ,
"label" : "knows" ,
"type" : "edge" ,
"outV" : "1:marko" ,
"outVLabel" : "person" ,
"inV" : "1:josh" ,
"inVLabel" : "person" ,
"properties" : {
"weight" : 1.5 ,
"date" : "20130221"
}
},
{
"id" : "S1:marko>1>>S1:vadas" ,
"label" : "knows" ,
"type" : "edge" ,
"outV" : "1:marko" ,
"outVLabel" : "person" ,
"inV" : "1:vadas" ,
"inVLabel" : "person" ,
"properties" : {
"weight" : 1.5 ,
"date" : "20160111"
}
}
],
"page" : "EoYxOm1hcmtvgggCAIQyOmxvcAAAAAAAAAAC"
} 返回的 body 里面是带有下一页的页号信息的,"page": "EoYxOm1hcmtvgggCAIQyOmxvcAAAAAAAAAAC",在查询下一页的时候将该值赋给 page 参数
分页查询所有边,获取下一页(page 带上上一页返回的 page 值),限定 2 条
Method & Url GET http://127.0.0.1:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/edges?page=EoYxOm1hcmtvgggCAIQyOmxvcAAAAAAAAAAC&limit=2 Response Status Response Body {
"edges" : [
{
"id" : "S1:marko>2>>S2:lop" ,
"label" : "created" ,
"type" : "edge" ,
"outV" : "1:marko" ,
"outVLabel" : "person" ,
"inV" : "2:lop" ,
"inVLabel" : "software" ,
"properties" : {
"weight" : 1.0 ,
"date" : "20171210"
}
}
],
"page" : null
} 此时 "page": null 表示已经没有下一页了
注:后端为 Cassandra 时,为了性能考虑,返回页恰好为最后一页时,返回 page 值可能非空,通过该 page 再请求下一页数据时则返回 空数据 及 page = null,其他情况类似
2.2.7 根据 id 获取边 Params 路径参数说明:
graphspace: 图空间名称 graph:待操作的图 id:待操作的边 id Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/edges/S1:marko>2>>S2:lop Response Status Response Body {
"id" : "S1:marko>2>>S2:lop" ,
"label" : "created" ,
"type" : "edge" ,
"outV" : "1:marko" ,
"outVLabel" : "person" ,
"inV" : "2:lop" ,
"inVLabel" : "software" ,
"properties" : {
"weight" : 1.0 ,
"date" : "20171210"
}
} 2.2.8 根据 id 删除边 Params 路径参数说明:
graphspace: 图空间名称 graph:待操作的图 id:待操作的边 id 请求参数说明:
仅根据 id 删除边
Method & Url DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/edges/S1:marko>2>>S2:lop Response Status 根据 label + id 删除边
通过指定 label 参数和 id 来删除边时,一般来说其性能比仅根据 id 删除会更好
Method & Url DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/graph/edges/S1:marko>1>>S1:vadas?label=knows Response Status 1.10 - Traverser API Traverser(图遍历)REST 接口:执行复杂的图算法和路径查询,包括最短路径、K近邻、相似度计算等高级分析功能。
3.1 traverser API 概述 HugeGraphServer 为 HugeGraph 图数据库提供了 RESTful API 接口。除了顶点和边的 CRUD 基本操作以外,还提供了一些遍历(traverser)方法,我们称为traverser API。这些遍历方法实现了一些复杂的图算法,方便用户对图进行分析和挖掘。
HugeGraph 支持的 Traverser API 包括:
K-out API,根据起始顶点,查找恰好 N 步可达的邻居,分为基础版和高级版:基础版使用 GET 方法,根据起始顶点,查找恰好 N 步可达的邻居 高级版使用 POST 方法,根据起始顶点,查找恰好 N 步可达的邻居,与基础版的不同在于:支持只统计邻居数量 支持顶点和边属性过滤 支持返回到达邻居的最短路径 K-neighbor API,根据起始顶点,查找 N 步以内可达的所有邻居,分为基础版和高级版:基础版使用 GET 方法,根据起始顶点,查找 N 步以内可达的所有邻居 高级版使用 POST 方法,根据起始顶点,查找 N 步以内可达的所有邻居,与基础版的不同在于:支持只统计邻居数量 支持顶点和边属性过滤 支持返回到达邻居的最短路径 Same Neighbors, 查询两个顶点的共同邻居 Jaccard Similarity API,计算 jaccard 相似度,包括两种:一种是使用 GET 方法,计算两个顶点的邻居的相似度(交并比) 一种是使用 POST 方法,在全图中查找与起点的 jaccard similarity 最高的 N 个点 Shortest Path API,查找两个顶点之间的最短路径 All Shortest Paths,查找两个顶点间的全部最短路径 Weighted Shortest Path,查找起点到目标点的带权最短路径 Single Source Shortest Path,查找一个点到其他各个点的加权最短路径 Multi Node Shortest Path,查找指定顶点集之间两两最短路径 Paths API,查找两个顶点间的全部路径,分为基础版和高级版:基础版使用 GET 方法,根据起点和终点,查找两个顶点间的全部路径 高级版使用 POST 方法,根据一组起点和一组终点,查找两个集合间符合条件的全部路径 Customized Paths API,从一批顶点出发,按(一种)模式遍历经过的全部路径 Template Path API,指定起点和终点以及起点和终点间路径信息,查找符合的路径 Crosspoints API,查找两个顶点的交点(共同祖先或者共同子孙) Customized Crosspoints API,从一批顶点出发,按多种模式遍历,最后一步到达的顶点的交点 Rings API,从起始顶点出发,可到达的环路路径 Rays API,从起始顶点出发,可到达边界的路径(即无环路径) Fusiform Similarity API,查找一个顶点的梭形相似点 Adamic-Adar API,计算两个顶点的 Adamic-Adar 指标 Resource Allocation API,计算两个顶点的资源分配指标 Edge Existence API,查询两个顶点之间存在的边 Count API,统计经过若干步遍历后可达的顶点数量,不返回顶点本身 Vertices API按 ID 批量查询顶点; 获取顶点的分区; 按分区查询顶点; Edges API按 ID 批量查询边; 获取边的分区; 按分区查询边; 3.2. traverser API 详解 使用方法中的例子,都是基于 TinkerPop 官网给出的图:
数据导入程序如下:
public class Loader {
public static void main ( String [] args ) {
HugeClient client = new HugeClient ( "http://127.0.0.1:8080" , "hugegraph" );
SchemaManager schema = client . schema ();
schema . propertyKey ( "name" ). asText (). ifNotExist (). create ();
schema . propertyKey ( "age" ). asInt (). ifNotExist (). create ();
schema . propertyKey ( "city" ). asText (). ifNotExist (). create ();
schema . propertyKey ( "weight" ). asDouble (). ifNotExist (). create ();
schema . propertyKey ( "lang" ). asText (). ifNotExist (). create ();
schema . propertyKey ( "date" ). asText (). ifNotExist (). create ();
schema . propertyKey ( "price" ). asInt (). ifNotExist (). create ();
schema . vertexLabel ( "person" )
. properties ( "name" , "age" , "city" )
. primaryKeys ( "name" )
. nullableKeys ( "age" )
. ifNotExist ()
. create ();
schema . vertexLabel ( "software" )
. properties ( "name" , "lang" , "price" )
. primaryKeys ( "name" )
. nullableKeys ( "price" )
. ifNotExist ()
. create ();
schema . indexLabel ( "personByCity" )
. onV ( "person" )
. by ( "city" )
. secondary ()
. ifNotExist ()
. create ();
schema . indexLabel ( "personByAgeAndCity" )
. onV ( "person" )
. by ( "age" , "city" )
. secondary ()
. ifNotExist ()
. create ();
schema . indexLabel ( "softwareByPrice" )
. onV ( "software" )
. by ( "price" )
. range ()
. ifNotExist ()
. create ();
schema . edgeLabel ( "knows" )
. multiTimes ()
. sourceLabel ( "person" )
. targetLabel ( "person" )
. properties ( "date" , "weight" )
. sortKeys ( "date" )
. nullableKeys ( "weight" )
. ifNotExist ()
. create ();
schema . edgeLabel ( "created" )
. sourceLabel ( "person" ). targetLabel ( "software" )
. properties ( "date" , "weight" )
. nullableKeys ( "weight" )
. ifNotExist ()
. create ();
schema . indexLabel ( "createdByDate" )
. onE ( "created" )
. by ( "date" )
. secondary ()
. ifNotExist ()
. create ();
schema . indexLabel ( "createdByWeight" )
. onE ( "created" )
. by ( "weight" )
. range ()
. ifNotExist ()
. create ();
schema . indexLabel ( "knowsByWeight" )
. onE ( "knows" )
. by ( "weight" )
. range ()
. ifNotExist ()
. create ();
GraphManager graph = client . graph ();
Vertex marko = graph . addVertex ( T . label , "person" , "name" , "marko" ,
"age" , 29 , "city" , "Beijing" );
Vertex vadas = graph . addVertex ( T . label , "person" , "name" , "vadas" ,
"age" , 27 , "city" , "Hongkong" );
Vertex lop = graph . addVertex ( T . label , "software" , "name" , "lop" ,
"lang" , "java" , "price" , 328 );
Vertex josh = graph . addVertex ( T . label , "person" , "name" , "josh" ,
"age" , 32 , "city" , "Beijing" );
Vertex ripple = graph . addVertex ( T . label , "software" , "name" , "ripple" ,
"lang" , "java" , "price" , 199 );
Vertex peter = graph . addVertex ( T . label , "person" , "name" , "peter" ,
"age" , 35 , "city" , "Shanghai" );
marko . addEdge ( "knows" , vadas , "date" , "20160110" , "weight" , 0 . 5 );
marko . addEdge ( "knows" , josh , "date" , "20130220" , "weight" , 1 . 0 );
marko . addEdge ( "created" , lop , "date" , "20171210" , "weight" , 0 . 4 );
josh . addEdge ( "created" , lop , "date" , "20091111" , "weight" , 0 . 4 );
josh . addEdge ( "created" , ripple , "date" , "20171210" , "weight" , 1 . 0 );
peter . addEdge ( "created" , lop , "date" , "20170324" , "weight" , 0 . 2 );
}
} 顶点 ID 为:
"2:ripple",
"1:vadas",
"1:peter",
"1:josh",
"1:marko",
"2:lop"边 ID 为:
"S1:peter>2>>S2:lop",
"S1:josh>2>>S2:lop",
"S1:josh>2>>S2:ripple",
"S1:marko>1>20130220>S1:josh",
"S1:marko>1>20160110>S1:vadas",
"S1:marko>2>>S2:lop"3.2.1 K-out API(GET,基础版) 3.2.1.1 功能介绍 根据起始顶点、方向、边的类型(可选)和深度 depth,查找从起始顶点出发恰好 depth 步可达的顶点
Params source:起始顶点 id,必填项 direction:起始顶点向外发散的方向(OUT,IN,BOTH),选填项,默认是 BOTH max_depth:步数,必填项 label:边的类型,选填项,默认代表所有 edge label nearest:nearest 为 true 时,代表起始顶点到达结果顶点的最短路径长度为 depth,不存在更短的路径;nearest 为 false 时,代表起始顶点到结果顶点有一条长度为 depth 的路径(未必最短且可以有环),选填项,默认为 true max_degree:查询过程中,单个顶点遍历的最大邻接边数目,选填项,默认为 10000 capacity:遍历过程中最大的访问的顶点数目,选填项,默认为 10000000 limit:返回的顶点的最大数目,选填项,默认为 10000000 3.2.1.2 使用方法 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/kout?source="1:marko"&max_depth=2Response Status Response Body {
"vertices" :[
"2:ripple" ,
"1:peter"
]
} 3.2.1.3 适用场景 查找恰好 N 步关系可达的顶点。两个例子:
家族关系中,查找一个人的所有孙子,person A 通过连续的两条“儿子”边到达的顶点集合。 社交关系中发现潜在好友,例如:与目标用户相隔两层朋友关系的用户,可以通过连续两条“朋友”边到达的顶点。 3.2.2 K-out API(POST,高级版) 3.2.2.1 功能介绍 根据起始顶点、步骤(包括方向、边类型和过滤属性)和深度 depth,查找从起始顶点出发恰好 depth 步可达的顶点。
与 K-out 基础版的不同在于:
支持只统计邻居数量 支持边属性过滤 支持返回到达邻居的最短路径 Params source:起始顶点 id,必填项 steps: 从起始点出发的 Steps,必填项,结构如下:direction:表示边的方向(OUT,IN,BOTH),默认是 BOTH edge_steps:边 Step 集合,支持对单边的类型和属性过滤,如果为空,则不过滤 vertex_steps:顶点 Step 集合,支持对单点的类型和属性过滤,如果为空,则不过滤label:顶点类型 properties:顶点属性 max_degree:查询过程中,单个顶点遍历的最大邻接边数目,默认为 10000 (注:0.12 版之前 step 内仅支持 degree 作为参数名,0.12 开始统一使用 max_degree, 并向下兼容 degree 写法) skip_degree:用于设置查询过程中舍弃超级顶点的最小边数,即当某个顶点的邻接边数目大于 skip_degree 时,完全舍弃该顶点。选填项,如果开启时,需满足 skip_degree >= max_degree 约束,默认为 0 (不启用),表示不跳过任何点 (注意:开启此配置后,遍历时会尝试访问一个顶点的 skip_degree 条边,而不仅仅是 max_degree 条边,这样有额外的遍历开销,对查询性能影响可能有较大影响,请确认理解后再开启) max_depth:步数,必填项 nearest:nearest 为 true 时,代表起始顶点到达结果顶点的最短路径长度为 depth,不存在更短的路径;nearest 为 false 时,代表起始顶点到结果顶点有一条长度为 depth 的路径(未必最短且可以有环),选填项,默认为 true count_only:Boolean 值,true 表示只统计结果的数目,不返回具体结果;false 表示返回具体的结果,默认为 false with_path:true 表示返回起始点到每个邻居的最短路径,false 表示不返回起始点到每个邻居的最短路径,选填项,默认为 false with_edge,选填项,默认为 false:如果设置为 true,则结果将包含所有边的完整信息,即路径中的所有边当 with_path 为 true 时,将返回所有路径中的边的完整信息 当 with_path 为 false 时,不返回任何信息 如果设置为 false,则仅返回边的 id with_vertex,选填项,默认为 false:如果设置为 true,则结果将包含所有顶点的完整信息,即路径中的所有顶点当 with_path 为 true 时,将返回所有路径中的顶点的完整信息 当 with_path 为 false 时,返回所有邻居顶点的完整信息 如果设置为 false,则仅返回顶点的 id capacity:遍历过程中最大的访问的顶点数目,选填项,默认为 10000000 limit:返回的顶点的最大数目,选填项,默认为 10000000 traverse_mode: 遍历方式,可选择“breadth_first_search”或“depth_first_search”作为参数,默认为“breadth_first_search” 3.2.2.2 使用方法 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/koutRequest Body {
"source" : "1:marko" ,
"steps" : {
"direction" : "BOTH" ,
"edge_steps" : [
{
"label" : "knows" ,
"properties" : {
"weight" : "P.gt(0.1)"
}
},
{
"label" : "created" ,
"properties" : {
"weight" : "P.gt(0.1)"
}
}
],
"vertex_steps" : [
{
"label" : "person" ,
"properties" : {
"age" : "P.lt(32)"
}
},
{
"label" : "software" ,
"properties" : {}
}
],
"max_degree" : 10000 ,
"skip_degree" : 100000
},
"max_depth" : 1 ,
"nearest" : true ,
"limit" : 10000 ,
"with_vertex" : true ,
"with_path" : true ,
"with_edge" : true
} Response Status Response Body {
"size" : 2 ,
"kout" : [
"1:vadas" ,
"2:lop"
],
"paths" : [
{
"objects" : [
"1:marko" ,
"2:lop"
]
},
{
"objects" : [
"1:marko" ,
"1:vadas"
]
}
],
"vertices" : [
{
"id" : "1:marko" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "marko" ,
"age" : 29 ,
"city" : "Beijing"
}
},
{
"id" : "1:vadas" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "vadas" ,
"age" : 27 ,
"city" : "Hongkong"
}
},
{
"id" : "2:lop" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" : {
"name" : "lop" ,
"lang" : "java" ,
"price" : 328
}
}
],
"edges" : [
{
"id" : "S1:marko>1>20160110>S1:vadas" ,
"label" : "knows" ,
"type" : "edge" ,
"outV" : "1:marko" ,
"outVLabel" : "person" ,
"inV" : "1:vadas" ,
"inVLabel" : "person" ,
"properties" : {
"weight" : 0.5 ,
"date" : "20160110"
}
},
{
"id" : "S1:marko>2>>S2:lop" ,
"label" : "created" ,
"type" : "edge" ,
"outV" : "1:marko" ,
"outVLabel" : "person" ,
"inV" : "2:lop" ,
"inVLabel" : "software" ,
"properties" : {
"weight" : 0.4 ,
"date" : "20171210"
}
}
]
} 3.2.2.3 适用场景 参见 3.2.1.3
3.2.3 K-neighbor(GET,基础版) 3.2.3.1 功能介绍 根据起始顶点、方向、边的类型(可选)和深度 depth,查找包括起始顶点在内、depth 步之内可达的所有顶点
相当于:起始顶点、K-out(1)、K-out(2)、… 、K-out(max_depth) 的并集
Params source: 起始顶点 id,必填项 direction:起始顶点向外发散的方向(OUT,IN,BOTH),选填项,默认是 BOTH max_depth:步数,必填项 label:边的类型,选填项,默认代表所有 edge label max_degree:查询过程中,单个顶点遍历的最大邻接边数目,选填项,默认为 10000 limit:返回的顶点的最大数目,也即遍历过程中最大的访问的顶点数目,选填项,默认为 10000000 3.2.3.2 使用方法 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/kneighbor?source=%221:marko%22&max_depth=2Response Status Response Body {
"vertices" :[
"2:ripple" ,
"1:marko" ,
"1:josh" ,
"1:vadas" ,
"1:peter" ,
"2:lop"
]
} 3.2.3.3 适用场景 查找 N 步以内可达的所有顶点,例如:
家族关系中,查找一个人五服以内所有子孙,person A 通过连续的 5 条“亲子”边到达的顶点集合。 社交关系中发现好友圈子,例如目标用户通过 1 条、2 条、3 条“朋友”边可到达的用户可以组成目标用户的朋友圈子 3.2.4 K-neighbor API(POST,高级版) 3.2.4.1 功能介绍 根据起始顶点、步骤(包括方向、边类型和过滤属性)和深度 depth,查找从起始顶点出发 depth 步内可达的所有顶点。
与 K-neighbor 基础版的不同在于:
支持只统计邻居数量 支持边属性过滤 支持返回到达邻居的最短路径 Params source:起始顶点 id,必填项 steps: 从起始点出发的 Steps,必填项,结构如下:direction:表示边的方向(OUT,IN,BOTH),默认是 BOTH 从起始点出发的 Steps,必填项,结构如下:direction:表示边的方向(OUT,IN,BOTH),默认是 BOTH edge_steps:边 Step 集合,支持对单边的类型和属性过滤,如果为空,则不过滤 vertex_steps:顶点 Step 集合,支持对单点的类型和属性过滤,如果为空,则不过滤label:顶点类型 properties:顶点属性 max_degree:查询过程中,单个顶点遍历的最大邻接边数目,默认为 10000 (注:0.12 版之前 step 内仅支持 degree 作为参数名,0.12 开始统一使用 max_degree, 并向下兼容 degree 写法) skip_degree:用于设置查询过程中舍弃超级顶点的最小边数,即当某个顶点的邻接边数目大于 skip_degree 时,完全舍弃该顶点。选填项,如果开启时,需满足 skip_degree >= max_degree 约束,默认为 0 (不启用),表示不跳过任何点 (注意:开启此配置后,遍历时会尝试访问一个顶点的 skip_degree 条边,而不仅仅是 max_degree 条边,这样有额外的遍历开销,对查询性能影响可能有较大影响,请确认理解后再开启) max_depth:步数,必填项 count_only:Boolean 值,true 表示只统计结果的数目,不返回具体结果;false 表示返回具体的结果,默认为 false with_path:true 表示返回起始点到每个邻居的最短路径,false 表示不返回起始点到每个邻居的最短路径,选填项,默认为 false with_edge,选填项,默认为 false:如果设置为 true,则结果将包含所有边的完整信息,即路径中的所有边当 with_path 为 true 时,将返回所有路径中的边的完整信息 当 with_path 为 false 时,不返回任何信息 如果设置为 false,则仅返回边的 id with_vertex,选填项,默认为 false:如果设置为 true,则结果将包含所有顶点的完整信息,即路径中的所有顶点当 with_path 为 true 时,将返回所有路径中的顶点的完整信息 当 with_path 为 false 时,返回所有邻居顶点的完整信息 如果设置为 false,则仅返回顶点的 id limit:返回的顶点的最大数目,选填项,默认为 10000000 3.2.4.2 使用方法 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/kneighborRequest Body {
"source" : "1:marko" ,
"steps" : {
"direction" : "BOTH" ,
"edge_steps" : [
{
"label" : "knows" ,
"properties" : {}
},
{
"label" : "created" ,
"properties" : {}
}
],
"vertex_steps" : [
{
"label" : "person" ,
"properties" : {
"age" : "P.gt(28)"
}
},
{
"label" : "software" ,
"properties" : {}
}
],
"max_degree" : 10000 ,
"skip_degree" : 100000
},
"max_depth" : 3 ,
"limit" : 10000 ,
"with_vertex" : true ,
"with_path" : true ,
"with_edge" : true
} Response Status Response Body {
"size" : 4 ,
"kneighbor" : [
"1:josh" ,
"2:lop" ,
"1:peter" ,
"2:ripple"
],
"paths" : [
{
"objects" : [
"1:marko" ,
"2:lop"
]
},
{
"objects" : [
"1:marko" ,
"2:lop" ,
"1:peter"
]
},
{
"objects" : [
"1:marko" ,
"1:josh"
]
},
{
"objects" : [
"1:marko" ,
"1:josh" ,
"2:ripple"
]
}
],
"vertices" : [
{
"id" : "2:ripple" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" : {
"name" : "ripple" ,
"lang" : "java" ,
"price" : 199
}
},
{
"id" : "1:marko" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "marko" ,
"age" : 29 ,
"city" : "Beijing"
}
},
{
"id" : "1:josh" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "josh" ,
"age" : 32 ,
"city" : "Beijing"
}
},
{
"id" : "1:peter" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "peter" ,
"age" : 35 ,
"city" : "Shanghai"
}
},
{
"id" : "2:lop" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" : {
"name" : "lop" ,
"lang" : "java" ,
"price" : 328
}
}
],
"edges" : [
{
"id" : "S1:josh>2>>S2:ripple" ,
"label" : "created" ,
"type" : "edge" ,
"outV" : "1:josh" ,
"outVLabel" : "person" ,
"inV" : "2:ripple" ,
"inVLabel" : "software" ,
"properties" : {
"weight" : 1.0 ,
"date" : "20171210"
}
},
{
"id" : "S1:marko>2>>S2:lop" ,
"label" : "created" ,
"type" : "edge" ,
"outV" : "1:marko" ,
"outVLabel" : "person" ,
"inV" : "2:lop" ,
"inVLabel" : "software" ,
"properties" : {
"weight" : 0.4 ,
"date" : "20171210"
}
},
{
"id" : "S1:marko>1>20130220>S1:josh" ,
"label" : "knows" ,
"type" : "edge" ,
"outV" : "1:marko" ,
"outVLabel" : "person" ,
"inV" : "1:josh" ,
"inVLabel" : "person" ,
"properties" : {
"weight" : 1.0 ,
"date" : "20130220"
}
},
{
"id" : "S1:peter>2>>S2:lop" ,
"label" : "created" ,
"type" : "edge" ,
"outV" : "1:peter" ,
"outVLabel" : "person" ,
"inV" : "2:lop" ,
"inVLabel" : "software" ,
"properties" : {
"weight" : 0.2 ,
"date" : "20170324"
}
}
]
} 3.2.4.3 适用场景 参见 3.2.3.3
3.2.5 Same Neighbors 3.2.5.1 功能介绍 查询两个点的共同邻居
Params vertex:一个顶点 id,必填项 other:另一个顶点 id,必填项 direction:顶点向外发散的方向(OUT,IN,BOTH),选填项,默认是 BOTH label:边的类型,选填项,默认代表所有 edge label max_degree:查询过程中,单个顶点遍历的最大邻接边数目,选填项,默认为 10000 limit:返回的共同邻居的最大数目,选填项,默认为 10000000 3.2.5.2 使用方法 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/sameneighbors?vertex=%221:marko%22&other=%221:josh%22Response Status Response Body {
"same_neighbors" :[
"2:lop"
]
} 3.2.5.3 适用场景 查找两个顶点的共同邻居:
3.2.6 Jaccard Similarity (GET) 3.2.6.1 功能介绍 计算两个顶点的 jaccard similarity(两个顶点邻居的交集比上两个顶点邻居的并集)
Params vertex:一个顶点 id,必填项 other:另一个顶点 id,必填项 direction:顶点向外发散的方向(OUT,IN,BOTH),选填项,默认是 BOTH label:边的类型,选填项,默认代表所有 edge label max_degree:查询过程中,单个顶点遍历的最大邻接边数目,选填项,默认为 10000 3.2.6.2 使用方法 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/jaccardsimilarity?vertex="1:marko"&other="1:josh"Response Status Response Body {
"jaccard_similarity" : 0.2
} 3.2.6.3 适用场景 用于评估两个点的相似性或者紧密度
3.2.7 Jaccard Similarity (POST) 3.2.7.1 功能介绍 计算与指定顶点的 jaccard similarity 最大的 N 个点
jaccard similarity 的计算方式为:两个顶点邻居的交集比上两个顶点邻居的并集
Params vertex:一个顶点 id,必填项 从起始点出发的 Step,必填项,结构如下:direction:表示边的方向(OUT,IN,BOTH),默认是 BOTH labels:边的类型列表 properties:通过属性的值过滤边 max_degree:查询过程中,单个顶点遍历的最大邻接边数目,默认为 10000 (注:0.12 版之前 step 内仅支持 degree 作为参数名,0.12 开始统一使用 max_degree, 并向下兼容 degree 写法) skip_degree:用于设置查询过程中舍弃超级顶点的最小边数,即当某个顶点的邻接边数目大于 skip_degree 时,完全舍弃该顶点。选填项,如果开启时,需满足 skip_degree >= max_degree 约束,默认为 0 (不启用),表示不跳过任何点 (注意:开启此配置后,遍历时会尝试访问一个顶点的 skip_degree 条边,而不仅仅是 max_degree 条边,这样有额外的遍历开销,对查询性能影响可能有较大影响,请确认理解后再开启) top:返回一个起点的 jaccard similarity 中最大的 top 个,选填项,默认为 100 capacity:遍历过程中最大的访问的顶点数目,选填项,默认为 10000000 3.2.7.2 使用方法 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/jaccardsimilarityRequest Body {
"vertex" : "1:marko" ,
"step" : {
"direction" : "BOTH" ,
"labels" : [],
"max_degree" : 10000 ,
"skip_degree" : 100000
},
"top" : 3
} Response Status Response Body {
"2:ripple" : 0.3333333333333333 ,
"1:peter" : 0.3333333333333333 ,
"1:josh" : 0.2
} 3.2.7.3 适用场景 用于在图中找出与指定顶点相似性最高的顶点
3.2.8 Shortest Path 3.2.8.1 功能介绍 根据起始顶点、目的顶点、方向、边的类型(可选)和最大深度,查找一条最短路径
Params source:起始顶点 id,必填项 target:目的顶点 id,必填项 direction:起始顶点向外发散的方向(OUT,IN,BOTH),选填项,默认是 BOTH max_depth:最大步数,必填项 label:边的类型,选填项,默认代表所有 edge label max_degree:查询过程中,单个顶点遍历的最大邻接边数目,选填项,默认为 10000 skip_degree:用于设置查询过程中舍弃超级顶点的最小边数,即当某个顶点的邻接边数目大于 skip_degree 时,完全舍弃该顶点。选填项,如果开启时,需满足 skip_degree >= max_degree 约束,默认为 0 (不启用),表示不跳过任何点 (注意:开启此配置后,遍历时会尝试访问一个顶点的 skip_degree 条边,而不仅仅是 max_degree 条边,这样有额外的遍历开销,对查询性能影响可能有较大影响,请确认理解后再开启) capacity:遍历过程中最大的访问的顶点数目,选填项,默认为 10000000 3.2.8.2 使用方法 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/shortestpath?source="1:marko"&target="2:ripple"&max_depth=3Response Status Response Body {
"path" :[
"1:marko" ,
"1:josh" ,
"2:ripple"
]
} 3.2.8.3 适用场景 查找两个顶点间的最短路径,例如:
社交关系网中,查找两个用户有关系的最短路径,即最近的朋友关系链 设备关联网络中,查找两个设备最短的关联关系 3.2.9 All Shortest Paths 3.2.9.1 功能介绍 根据起始顶点、目的顶点、方向、边的类型(可选)和最大深度,查找两点间所有的最短路径
Params source:起始顶点 id,必填项 target:目的顶点 id,必填项 direction:起始顶点向外发散的方向(OUT,IN,BOTH),选填项,默认是 BOTH max_depth:最大步数,必填项 label:边的类型,选填项,默认代表所有 edge label max_degree:查询过程中,单个顶点遍历的最大邻接边数目,选填项,默认为 10000 skip_degree:用于设置查询过程中舍弃超级顶点的最小边数,即当某个顶点的邻接边数目大于 skip_degree 时,完全舍弃该顶点。选填项,如果开启时,需满足 skip_degree >= max_degree 约束,默认为 0 (不启用),表示不跳过任何点 (注意:开启此配置后,遍历时会尝试访问一个顶点的 skip_degree 条边,而不仅仅是 max_degree 条边,这样有额外的遍历开销,对查询性能影响可能有较大影响,请确认理解后再开启) capacity:遍历过程中最大的访问的顶点数目,选填项,默认为 10000000 3.2.9.2 使用方法 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/allshortestpaths?source="A"&target="Z"&max_depth=10Response Status Response Body {
"paths" :[
{
"objects" : [
"A" ,
"B" ,
"C" ,
"Z"
]
},
{
"objects" : [
"A" ,
"M" ,
"N" ,
"Z"
]
}
]
} 3.2.9.3 适用场景 查找两个顶点间的所有最短路径,例如:
社交关系网中,查找两个用户有关系的全部最短路径,即最近的朋友关系链 设备关联网络中,查找两个设备全部的最短关联关系 3.2.10 Weighted Shortest Path 3.2.10.1 功能介绍 根据起始顶点、目的顶点、方向、边的类型(可选)和最大深度,查找一条带权最短路径
Params source:起始顶点 id,必填项 target:目的顶点 id,必填项 direction:起始顶点向外发散的方向(OUT,IN,BOTH),选填项,默认是 BOTH label:边的类型,选填项,默认代表所有 edge label weight:边的权重属性,必填项,必须是数字类型的属性 max_degree:查询过程中,单个顶点遍历的最大邻接边数目,选填项,默认为 10000 skip_degree:用于设置查询过程中舍弃超级顶点的最小边数,即当某个顶点的邻接边数目大于 skip_degree 时,完全舍弃该顶点。选填项,如果开启时,需满足 skip_degree >= max_degree 约束,默认为 0 (不启用),表示不跳过任何点 (注意:开启此配置后,遍历时会尝试访问一个顶点的 skip_degree 条边,而不仅仅是 max_degree 条边,这样有额外的遍历开销,对查询性能影响可能有较大影响,请确认理解后再开启) capacity:遍历过程中最大的访问的顶点数目,选填项,默认为 10000000 with_vertex:true 表示返回结果包含完整的顶点信息(路径中的全部顶点),false 时表示只返回顶点 id,选填项,默认为 false 3.2.10.2 使用方法 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/weightedshortestpath?source="1:marko"&target="2:ripple"&weight="weight"&with_vertex=trueResponse Status Response Body {
"path" : {
"weight" : 2.0 ,
"vertices" : [
"1:marko" ,
"1:josh" ,
"2:ripple"
]
},
"vertices" : [
{
"id" : "1:marko" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "marko" ,
"age" : 29 ,
"city" : "Beijing"
}
},
{
"id" : "1:josh" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "josh" ,
"age" : 32 ,
"city" : "Beijing"
}
},
{
"id" : "2:ripple" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" : {
"name" : "ripple" ,
"lang" : "java" ,
"price" : 199
}
}
]
} 3.2.10.3 适用场景 查找两个顶点间的带权最短路径,例如:
交通线路中查找从 A 城市到 B 城市花钱最少的交通方式 3.2.11 Single Source Shortest Path 3.2.11.1 功能介绍 从一个顶点出发,查找该点到图中其他顶点的最短路径(可选是否带权重)
Params source:起始顶点 id,必填项 direction:起始顶点向外发散的方向(OUT,IN,BOTH),选填项,默认是 BOTH label:边的类型,选填项,默认代表所有 edge label weight:边的权重属性,选填项,必须是数字类型的属性,如果不填或者虽然填了但是边没有该属性,则权重为 1.0 max_degree:查询过程中,单个顶点遍历的最大邻接边数目,选填项,默认为 10000 skip_degree:用于设置查询过程中舍弃超级顶点的最小边数,即当某个顶点的邻接边数目大于 skip_degree 时,完全舍弃该顶点。选填项,如果开启时,需满足 skip_degree >= max_degree 约束,默认为 0 (不启用),表示不跳过任何点 (注意:开启此配置后,遍历时会尝试访问一个顶点的 skip_degree 条边,而不仅仅是 max_degree 条边,这样有额外的遍历开销,对查询性能影响可能有较大影响,请确认理解后再开启) capacity:遍历过程中最大的访问的顶点数目,选填项,默认为 10000000 limit:查询到的目标顶点个数,也是返回的最短路径的条数,选填项,默认为 10 with_vertex:true 表示返回结果包含完整的顶点信息(路径中的全部顶点),false 时表示只返回顶点 id,选填项,默认为 false 3.2.11.2 使用方法 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/singlesourceshortestpath?source="1:marko"&with_vertex=trueResponse Status Response Body {
"paths" : {
"2:ripple" : {
"weight" : 2.0 ,
"vertices" : [
"1:marko" ,
"1:josh" ,
"2:ripple"
]
},
"1:josh" : {
"weight" : 1.0 ,
"vertices" : [
"1:marko" ,
"1:josh"
]
},
"1:vadas" : {
"weight" : 1.0 ,
"vertices" : [
"1:marko" ,
"1:vadas"
]
},
"1:peter" : {
"weight" : 2.0 ,
"vertices" : [
"1:marko" ,
"2:lop" ,
"1:peter"
]
},
"2:lop" : {
"weight" : 1.0 ,
"vertices" : [
"1:marko" ,
"2:lop"
]
}
},
"vertices" : [
{
"id" : "2:ripple" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" : {
"name" : "ripple" ,
"lang" : "java" ,
"price" : 199
}
},
{
"id" : "1:marko" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "marko" ,
"age" : 29 ,
"city" : "Beijing"
}
},
{
"id" : "1:josh" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "josh" ,
"age" : 32 ,
"city" : "Beijing"
}
},
{
"id" : "1:vadas" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "vadas" ,
"age" : 27 ,
"city" : "Hongkong"
}
},
{
"id" : "1:peter" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "peter" ,
"age" : 35 ,
"city" : "Shanghai"
}
},
{
"id" : "2:lop" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" : {
"name" : "lop" ,
"lang" : "java" ,
"price" : 328
}
}
]
} 3.2.11.3 适用场景 查找从一个点出发到其他顶点的带权最短路径,比如:
查找从北京出发到全国其他所有城市的耗时最短的乘车方案 3.2.12 Multi Node Shortest Path 3.2.12.1 功能介绍 查找指定顶点集两两之间的最短路径
Params vertices:定义起始顶点,必填项,指定方式包括:ids:通过顶点 id 列表提供起始顶点 label 和 properties:如果没有指定 ids,则使用 label 和 properties 的联合条件查询起始顶点label:顶点的类型 properties:通过属性的值查询起始顶点 注意:properties 中的属性值可以是列表,表示只要 key 对应的 value 在列表中就可以
step:表示从起始顶点到终止顶点走过的路径,必填项,Step 的结构如下:direction:表示边的方向(OUT,IN,BOTH),默认是 BOTH labels:边的类型列表 properties:通过属性的值过滤边 max_degree:查询过程中,单个顶点遍历的最大邻接边数目,默认为 10000 (注:0.12 版之前 step 内仅支持 degree 作为参数名,0.12 开始统一使用 max_degree, 并向下兼容 degree 写法) skip_degree:用于设置查询过程中舍弃超级顶点的最小边数,即当某个顶点的邻接边数目大于 skip_degree 时,完全舍弃该顶点。选填项,如果开启时,需满足 skip_degree >= max_degree 约束,默认为 0 (不启用),表示不跳过任何点 (注意:开启此配置后,遍历时会尝试访问一个顶点的 skip_degree 条边,而不仅仅是 max_degree 条边,这样有额外的遍历开销,对查询性能影响可能有较大影响,请确认理解后再开启) max_depth:步数,必填项 capacity:遍历过程中最大的访问的顶点数目,选填项,默认为 10000000 with_vertex:true 表示返回结果包含完整的顶点信息(路径中的全部顶点),false 时表示只返回顶点 id,选填项,默认为 false 3.2.12.2 使用方法 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/multinodeshortestpathRequest Body {
"vertices" : {
"ids" : [ "382:marko" , "382:josh" , "382:vadas" , "382:peter" , "383:lop" , "383:ripple" ]
},
"step" : {
"direction" : "BOTH" ,
"properties" : {
}
},
"max_depth" : 10 ,
"capacity" : 100000000 ,
"with_vertex" : true
} Response Status Response Body {
"paths" : [
{
"objects" : [
"382:peter" ,
"383:lop"
]
},
{
"objects" : [
"382:peter" ,
"383:lop" ,
"382:marko"
]
},
{
"objects" : [
"382:peter" ,
"383:lop" ,
"382:josh"
]
},
{
"objects" : [
"382:peter" ,
"383:lop" ,
"382:marko" ,
"382:vadas"
]
},
{
"objects" : [
"383:lop" ,
"382:marko"
]
},
{
"objects" : [
"383:lop" ,
"382:josh"
]
},
{
"objects" : [
"383:lop" ,
"382:marko" ,
"382:vadas"
]
},
{
"objects" : [
"382:peter" ,
"383:lop" ,
"382:josh" ,
"383:ripple"
]
},
{
"objects" : [
"382:marko" ,
"382:josh"
]
},
{
"objects" : [
"383:lop" ,
"382:josh" ,
"383:ripple"
]
},
{
"objects" : [
"382:marko" ,
"382:vadas"
]
},
{
"objects" : [
"382:marko" ,
"382:josh" ,
"383:ripple"
]
},
{
"objects" : [
"382:josh" ,
"383:ripple"
]
},
{
"objects" : [
"382:josh" ,
"382:marko" ,
"382:vadas"
]
},
{
"objects" : [
"382:vadas" ,
"382:marko" ,
"382:josh" ,
"383:ripple"
]
}
],
"vertices" : [
{
"id" : "382:peter" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "peter" ,
"age" : 29 ,
"city" : "Shanghai"
}
},
{
"id" : "383:lop" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" : {
"name" : "lop" ,
"lang" : "java" ,
"price" : 328
}
},
{
"id" : "382:marko" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "marko" ,
"age" : 29 ,
"city" : "Beijing"
}
},
{
"id" : "382:josh" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "josh" ,
"age" : 32 ,
"city" : "Beijing"
}
},
{
"id" : "382:vadas" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "vadas" ,
"age" : 27 ,
"city" : "Hongkong"
}
},
{
"id" : "383:ripple" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" : {
"name" : "ripple" ,
"lang" : "java" ,
"price" : 199
}
}
]
} 3.2.12.3 适用场景 查找多个点之间的最短路径,比如:
3.2.13 Paths(GET,基础版) 3.2.13.1 功能介绍 根据起始顶点、目的顶点、方向、边的类型(可选)和最大深度等条件查找所有路径
Params source:起始顶点 id,必填项 target:目的顶点 id,必填项 direction:起始顶点向外发散的方向(OUT,IN,BOTH),选填项,默认是 BOTH label:边的类型,选填项,默认代表所有 edge label max_depth:步数,必填项 max_degree:查询过程中,单个顶点遍历的最大邻接边数目,选填项,默认为 10000 capacity:遍历过程中最大的访问的顶点数目,选填项,默认为 10000000 limit:返回的路径的最大数目,选填项,默认为 10 3.2.13.2 使用方法 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/paths?source="1:marko"&target="1:josh"&max_depth=5Response Status Response Body {
"paths" :[
{
"objects" :[
"1:marko" ,
"1:josh"
]
},
{
"objects" :[
"1:marko" ,
"2:lop" ,
"1:josh"
]
}
]
} 3.2.13.3 适用场景 查找两个顶点间的所有路径,例如:
社交网络中,查找两个用户所有可能的关系路径 设备关联网络中,查找两个设备之间所有的关联路径 3.2.14 Paths(POST,高级版) 3.2.14.1 功能介绍 根据起始顶点、目的顶点、步骤(step)和最大深度等条件查找所有路径
Params sources:定义起始顶点,必填项,指定方式包括:ids:通过顶点 id 列表提供起始顶点 label 和 properties:如果没有指定 ids,则使用 label 和 properties 的联合条件查询起始顶点label:顶点的类型 properties:通过属性的值查询起始顶点 注意:properties 中的属性值可以是列表,表示只要 key 对应的 value 在列表中就可以
targets:定义终止顶点,必填项,指定方式包括:ids:通过顶点 id 列表提供终止顶点 label 和 properties:如果没有指定 ids,则使用 label 和 properties 的联合条件查询终止顶点label:顶点的类型 properties:通过属性的值查询终止顶点 注意:properties 中的属性值可以是列表,表示只要 key 对应的 value 在列表中就可以
step:表示从起始顶点到终止顶点走过的路径,必填项,Step 的结构如下:direction:表示边的方向(OUT,IN,BOTH),默认是 BOTH labels:边的类型列表 properties:通过属性的值过滤边 max_degree:查询过程中,单个顶点遍历的最大邻接边数目,默认为 10000 (注:0.12 版之前 step 内仅支持 degree 作为参数名,0.12 开始统一使用 max_degree, 并向下兼容 degree 写法) skip_degree:用于设置查询过程中舍弃超级顶点的最小边数,即当某个顶点的邻接边数目大于 skip_degree 时,完全舍弃该顶点。选填项,如果开启时,需满足 skip_degree >= max_degree 约束,默认为 0 (不启用),表示不跳过任何点 (注意:开启此配置后,遍历时会尝试访问一个顶点的 skip_degree 条边,而不仅仅是 max_degree 条边,这样有额外的遍历开销,对查询性能影响可能有较大影响,请确认理解后再开启) max_depth:步数,必填项 nearest:nearest 为 true 时,代表起始顶点到达结果顶点的最短路径长度为 depth,不存在更短的路径;nearest 为 false 时,代表起始顶点到结果顶点有一条长度为 depth 的路径(未必最短且可以有环),选填项,默认为 true capacity:遍历过程中最大的访问的顶点数目,选填项,默认为 10000000 limit:返回的路径的最大数目,选填项,默认为 10 with_vertex:true 表示返回结果包含完整的顶点信息(路径中的全部顶点),false 时表示只返回顶点 id,选填项,默认为 false 3.2.14.2 使用方法 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/pathsRequest Body {
"sources" : {
"ids" : [ "1:marko" ]
},
"targets" : {
"ids" : [ "1:peter" ]
},
"step" : {
"direction" : "BOTH" ,
"properties" : {
"weight" : "P.gt(0.01)"
}
},
"max_depth" : 10 ,
"capacity" : 100000000 ,
"limit" : 10000000 ,
"with_vertex" : false
} Response Status Response Body {
"paths" : [
{
"objects" : [
"1:marko" ,
"1:josh" ,
"2:lop" ,
"1:peter"
]
},
{
"objects" : [
"1:marko" ,
"2:lop" ,
"1:peter"
]
}
]
} 3.2.14.3 适用场景 查找两个顶点间的所有路径,例如:
社交网络中,查找两个用户所有可能的关系路径 设备关联网络中,查找两个设备之间所有的关联路径 3.2.15 Customized Paths 3.2.15.1 功能介绍 根据一批起始顶点、边规则(包括方向、边的类型和属性过滤)和最大深度等条件查找符合条件的所有的路径
Params sources:定义起始顶点,必填项,指定方式包括:ids:通过顶点 id 列表提供起始顶点 label 和 properties:如果没有指定 ids,则使用 label 和 properties 的联合条件查询起始顶点label:顶点的类型 properties:通过属性的值查询起始顶点 注意:properties 中的属性值可以是列表,表示只要 key 对应的 value 在列表中就可以
steps:表示从起始顶点走过的路径规则,是一组 Step 的列表。必填项。每个 Step 的结构如下:direction:表示边的方向(OUT,IN,BOTH),默认是 BOTH labels:边的类型列表 properties:通过属性的值过滤边 weight_by:根据指定的属性计算边的权重,sort_by 不为 NONE 时有效,与 default_weight 互斥 default_weight:当边没有属性作为权重计算值时,采取的默认权重,sort_by 不为 NONE 时有效,与 weight_by 互斥 max_degree:查询过程中,单个顶点遍历的最大邻接边数目,默认为 10000 (注:0.12 版之前 step 内仅支持 degree 作为参数名,0.12 开始统一使用 max_degree, 并向下兼容 degree 写法) sample:当需要对某个 step 的符合条件的边进行采样时设置,-1 表示不采样,默认为采样 100 sort_by:根据路径的权重排序,选填项,默认为 NONE:NONE 表示不排序,默认值 INCR 表示按照路径权重的升序排序 DECR 表示按照路径权重的降序排序 capacity:遍历过程中最大的访问的顶点数目,选填项,默认为 10000000 limit:返回的路径的最大数目,选填项,默认为 10 with_vertex:true 表示返回结果包含完整的顶点信息(路径中的全部顶点),false 时表示只返回顶点 id,选填项,默认为 false 3.2.15.2 使用方法 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/customizedpathsRequest Body {
"sources" :{
"ids" :[
],
"label" : "person" ,
"properties" :{
"name" : "marko"
}
},
"steps" :[
{
"direction" : "OUT" ,
"labels" :[
"knows"
],
"weight_by" : "weight" ,
"max_degree" : -1
},
{
"direction" : "OUT" ,
"labels" :[
"created"
],
"default_weight" : 8 ,
"max_degree" : -1 ,
"sample" : 1
}
],
"sort_by" : "INCR" ,
"with_vertex" : true ,
"capacity" : -1 ,
"limit" : -1
} Response Status Response Body {
"paths" :[
{
"objects" :[
"1:marko" ,
"1:josh" ,
"2:lop"
],
"weights" :[
1 ,
8
]
}
],
"vertices" :[
{
"id" : "1:marko" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" :{
"city" :[
{
"id" : "1:marko>city" ,
"value" : "Beijing"
}
],
"name" :[
{
"id" : "1:marko>name" ,
"value" : "marko"
}
],
"age" :[
{
"id" : "1:marko>age" ,
"value" : 29
}
]
}
},
{
"id" : "1:josh" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" :{
"city" :[
{
"id" : "1:josh>city" ,
"value" : "Beijing"
}
],
"name" :[
{
"id" : "1:josh>name" ,
"value" : "josh"
}
],
"age" :[
{
"id" : "1:josh>age" ,
"value" : 32
}
]
}
},
{
"id" : "2:lop" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" :{
"price" :[
{
"id" : "2:lop>price" ,
"value" : 328
}
],
"name" :[
{
"id" : "2:lop>name" ,
"value" : "lop"
}
],
"lang" :[
{
"id" : "2:lop>lang" ,
"value" : "java"
}
]
}
}
]
} 3.2.15.3 适用场景 适合查找各种复杂的路径集合,例如:
社交网络中,查找看过张艺谋所导演的电影的用户关注的大 V 的路径(张艺谋—>电影—->用户—>大 V) 风控网络中,查找多个高风险用户的直系亲属的朋友的路径(高风险用户—>直系亲属—>朋友) 3.2.16 Template Paths 3.2.16.1 功能介绍 根据一批起始顶点、边规则(包括方向、边的类型和属性过滤)和最大深度等条件查找符合条件的所有的路径
Params sources:定义起始顶点,必填项,指定方式包括:ids:通过顶点 id 列表提供起始顶点 label 和 properties:如果没有指定 ids,则使用 label 和 properties 的联合条件查询起始顶点label:顶点的类型 properties:通过属性的值查询起始顶点 注意:properties 中的属性值可以是列表,表示只要 key 对应的 value 在列表中就可以
targets:定义终止顶点,必填项,指定方式包括:ids:通过顶点 id 列表提供终止顶点 label 和 properties:如果没有指定 ids,则使用 label 和 properties 的联合条件查询终止顶点label:顶点的类型 properties:通过属性的值查询终止顶点 注意:properties 中的属性值可以是列表,表示只要 key 对应的 value 在列表中就可以
steps:表示从起始顶点走过的路径规则,是一组 Step 的列表。必填项。每个 Step 的结构如下:direction:表示边的方向(OUT,IN,BOTH),默认是 BOTH labels:边的类型列表 properties:通过属性的值过滤边 max_times:当前 step 可以重复的次数,当为 N 时,表示从起始顶点可以经过当前 step 1-N 次 max_degree:查询过程中,单个顶点遍历的最大邻接边数目,默认为 10000 (注:0.12 版之前 step 内仅支持 degree 作为参数名,0.12 开始统一使用 max_degree, 并向下兼容 degree 写法) skip_degree:用于设置查询过程中舍弃超级顶点的最小边数,即当某个顶点的邻接边数目大于 skip_degree 时,完全舍弃该顶点。选填项,如果开启时,需满足 skip_degree >= max_degree 约束,默认为 0 (不启用),表示不跳过任何点 (注意:开启此配置后,遍历时会尝试访问一个顶点的 skip_degree 条边,而不仅仅是 max_degree 条边,这样有额外的遍历开销,对查询性能影响可能有较大影响,请确认理解后再开启) with_ring:Boolean 值,true 表示包含环路;false 表示不包含环路,默认为 false capacity:遍历过程中最大的访问的顶点数目,选填项,默认为 10000000 limit:返回的路径的最大数目,选填项,默认为 10 with_vertex:true 表示返回结果包含完整的顶点信息(路径中的全部顶点),false 时表示只返回顶点 id,选填项,默认为 false 3.2.16.2 使用方法 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/templatepathsRequest Body {
"sources" : {
"ids" : [],
"label" : "person" ,
"properties" : {
"name" : "vadas"
}
},
"targets" : {
"ids" : [],
"label" : "software" ,
"properties" : {
"name" : "ripple"
}
},
"steps" : [
{
"direction" : "IN" ,
"labels" : [ "knows" ],
"properties" : {
},
"max_degree" : 10000 ,
"skip_degree" : 100000
},
{
"direction" : "OUT" ,
"labels" : [ "created" ],
"properties" : {
},
"max_degree" : 10000 ,
"skip_degree" : 100000
},
{
"direction" : "IN" ,
"labels" : [ "created" ],
"properties" : {
},
"max_degree" : 10000 ,
"skip_degree" : 100000
},
{
"direction" : "OUT" ,
"labels" : [ "created" ],
"properties" : {
},
"max_degree" : 10000 ,
"skip_degree" : 100000
}
],
"capacity" : 10000 ,
"limit" : 10 ,
"with_vertex" : true
} Response Status Response Body {
"paths" : [
{
"objects" : [
"1:vadas" ,
"1:marko" ,
"2:lop" ,
"1:josh" ,
"2:ripple"
]
}
],
"vertices" : [
{
"id" : "2:ripple" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" : {
"name" : "ripple" ,
"lang" : "java" ,
"price" : 199
}
},
{
"id" : "1:marko" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "marko" ,
"age" : 29 ,
"city" : "Beijing"
}
},
{
"id" : "1:josh" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "josh" ,
"age" : 32 ,
"city" : "Beijing"
}
},
{
"id" : "1:vadas" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "vadas" ,
"age" : 27 ,
"city" : "Hongkong"
}
},
{
"id" : "2:lop" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" : {
"name" : "lop" ,
"lang" : "java" ,
"price" : 328
}
}
]
} 3.2.16.3 适用场景 适合查找各种复杂的模板路径,比如 personA -(朋友)-> personB -(同学)-> personC,其中"朋友"和"同学"边可以分别是最多 3 层和 4 层的情况
3.2.17 Crosspoints 3.2.17.1 功能介绍 根据起始顶点、目的顶点、方向、边的类型(可选)和最大深度等条件查找相交点
Params source:起始顶点 id,必填项 target:目的顶点 id,必填项 direction:起始顶点到目的顶点的方向,目的点到起始点是反方向,BOTH 时不考虑方向(OUT,IN,BOTH),选填项,默认是 BOTH label:边的类型,选填项,默认代表所有 edge label max_depth:步数,必填项 max_degree:查询过程中,单个顶点遍历的最大邻接边数目,选填项,默认为 10000 capacity:遍历过程中最大的访问的顶点数目,选填项,默认为 10000000 limit:返回的交点的最大数目,选填项,默认为 10 3.2.17.2 使用方法 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/crosspoints?source="2:lop"&target="2:ripple"&max_depth=5&direction=INResponse Status Response Body {
"crosspoints" :[
{
"crosspoint" : "1:josh" ,
"objects" :[
"2:lop" ,
"1:josh" ,
"2:ripple"
]
}
]
} 3.2.17.3 适用场景 查找两个顶点的交点及其路径,例如:
社交网络中,查找两个用户共同关注的话题或者大 V 家族关系中,查找共同的祖先 3.2.18 Customized Crosspoints 3.2.18.1 功能介绍 根据一批起始顶点、多种边规则(包括方向、边的类型和属性过滤)和最大深度等条件查找符合条件的所有的路径终点的交集
Params sources:定义起始顶点,必填项,指定方式包括:
ids:通过顶点 id 列表提供起始顶点 label 和 properties:如果没有指定 ids,则使用 label 和 properties 的联合条件查询起始顶点label:顶点的类型 properties:通过属性的值查询起始顶点 注意:properties 中的属性值可以是列表,表示只要 key 对应的 value 在列表中就可以
path_patterns:表示从起始顶点走过的路径规则,是一组规则的列表。必填项。每个规则是一个 PathPattern
每个 PathPattern 是一组 Step 列表,每个 Step 结构如下:direction:表示边的方向(OUT,IN,BOTH),默认是 BOTH labels:边的类型列表 properties:通过属性的值过滤边 max_degree:查询过程中,单个顶点遍历的最大邻接边数目,默认为 10000 (注:0.12 版之前 step 内仅支持 degree 作为参数名,0.12 开始统一使用 max_degree, 并向下兼容 degree 写法) skip_degree:用于设置查询过程中舍弃超级顶点的最小边数,即当某个顶点的邻接边数目大于 skip_degree 时,完全舍弃该顶点。选填项,如果开启时,需满足 skip_degree >= max_degree 约束,默认为 0 (不启用),表示不跳过任何点 (注意:开启此配置后,遍历时会尝试访问一个顶点的 skip_degree 条边,而不仅仅是 max_degree 条边,这样有额外的遍历开销,对查询性能影响可能有较大影响,请确认理解后再开启) capacity:遍历过程中最大的访问的顶点数目,选填项,默认为 10000000
limit:返回的路径的最大数目,选填项,默认为 10
with_path:true 表示返回交点所在的路径,false 表示不返回交点所在的路径,选填项,默认为 false
with_vertex,选填项,默认为 false:
true 表示返回结果包含完整的顶点信息(路径中的全部顶点)with_path 为 true 时,返回所有路径中的顶点的完整信息 with_path 为 false 时,返回所有交点的完整信息 false 时表示只返回顶点 id 3.2.18.2 使用方法 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/customizedcrosspointsRequest Body {
"sources" :{
"ids" :[
"2:lop" ,
"2:ripple"
]
},
"path_patterns" :[
{
"steps" :[
{
"direction" : "IN" ,
"labels" :[
"created"
],
"max_degree" : -1
}
]
}
],
"with_path" : true ,
"with_vertex" : true ,
"capacity" : -1 ,
"limit" : -1
} Response Status Response Body {
"crosspoints" :[
"1:josh"
],
"paths" :[
{
"objects" :[
"2:ripple" ,
"1:josh"
]
},
{
"objects" :[
"2:lop" ,
"1:josh"
]
}
],
"vertices" :[
{
"id" : "2:ripple" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" :{
"price" :[
{
"id" : "2:ripple>price" ,
"value" : 199
}
],
"name" :[
{
"id" : "2:ripple>name" ,
"value" : "ripple"
}
],
"lang" :[
{
"id" : "2:ripple>lang" ,
"value" : "java"
}
]
}
},
{
"id" : "1:josh" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" :{
"city" :[
{
"id" : "1:josh>city" ,
"value" : "Beijing"
}
],
"name" :[
{
"id" : "1:josh>name" ,
"value" : "josh"
}
],
"age" :[
{
"id" : "1:josh>age" ,
"value" : 32
}
]
}
},
{
"id" : "2:lop" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" :{
"price" :[
{
"id" : "2:lop>price" ,
"value" : 328
}
],
"name" :[
{
"id" : "2:lop>name" ,
"value" : "lop"
}
],
"lang" :[
{
"id" : "2:lop>lang" ,
"value" : "java"
}
]
}
}
]
} 3.2.18.3 适用场景 查询一组顶点通过多种路径在终点有交集的情况。例如:
在商品图谱中,多款手机、学习机、游戏机通过不同的低级别的类目路径,最终都属于一级类目的电子设备 3.2.19 Rings 3.2.19.1 功能介绍 根据起始顶点、方向、边的类型(可选)和最大深度等条件查找可达的环路
例如:1 -> 25 -> 775 -> 14690 -> 25, 其中环路为 25 -> 775 -> 14690 -> 25
Params source:起始顶点 id,必填项 direction:起始顶点发出的边的方向(OUT,IN,BOTH),选填项,默认是 BOTH label:边的类型,选填项,默认代表所有 edge label max_depth:步数,必填项 source_in_ring:环路是否包含起点,选填项,默认为 true max_degree:查询过程中,单个顶点遍历的最大邻接边数目,选填项,默认为 10000 capacity:遍历过程中最大的访问的顶点数目,选填项,默认为 10000000 limit:返回的可达环路的最大数目,选填项,默认为 10 3.2.19.2 使用方法 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/rings?source="1:marko"&max_depth=2Response Status Response Body {
"rings" :[
{
"objects" :[
"1:marko" ,
"1:josh" ,
"1:marko"
]
},
{
"objects" :[
"1:marko" ,
"1:vadas" ,
"1:marko"
]
},
{
"objects" :[
"1:marko" ,
"2:lop" ,
"1:marko"
]
}
]
} 3.2.19.3 适用场景 查询起始顶点可达的环路,例如:
风控项目中,查询一个用户可达的循环担保的人或者设备 设备关联网络中,发现一个设备周围的循环引用的设备 3.2.20 Rays 3.2.20.1 功能介绍 根据起始顶点、方向、边的类型(可选)和最大深度等条件查找发散到边界顶点的路径
例如:1 -> 25 -> 775 -> 14690 -> 2289 -> 18379, 其中 18379 为边界顶点,即没有从 18379 发出的边
Params source:起始顶点 id,必填项 direction:起始顶点发出的边的方向(OUT,IN,BOTH),选填项,默认是 BOTH label:边的类型,选填项,默认代表所有 edge label max_depth:步数,必填项 max_degree:查询过程中,单个顶点遍历的最大邻接边数目,选填项,默认为 10000 capacity:遍历过程中最大的访问的顶点数目,选填项,默认为 10000000 limit:返回的非环路的最大数目,选填项,默认为 10 3.2.20.2 使用方法 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/rays?source="1:marko"&max_depth=2&direction=OUTResponse Status Response Body {
"rays" :[
{
"objects" :[
"1:marko" ,
"1:vadas"
]
},
{
"objects" :[
"1:marko" ,
"2:lop"
]
},
{
"objects" :[
"1:marko" ,
"1:josh" ,
"2:ripple"
]
},
{
"objects" :[
"1:marko" ,
"1:josh" ,
"2:lop"
]
}
]
} 3.2.20.3 适用场景 查找起始顶点到某种关系的边界顶点的路径,例如:
家族关系中,查找一个人到所有还没有孩子的子孙的路径 设备关联网络中,找到某个设备到终端设备的路径 3.2.21.1 功能介绍 按照条件查询一批顶点对应的"梭形相似点"。当两个顶点跟很多共同的顶点之间有某种关系的时候,我们认为这两个点为"梭形相似点"。举个例子说明"梭形相似点":“读者 A"读了 100 本书,可以定义读过这 100 本书中的 80 本以上的读者,是"读者 A"的"梭形相似点”
Params sources:定义起始顶点,必填项,指定方式包括:
ids:通过顶点 id 列表提供起始顶点 label 和 properties:如果没有指定 ids,则使用 label 和 properties 的联合条件查询起始顶点label:顶点的类型 properties:通过属性的值查询起始顶点 注意:properties 中的属性值可以是列表,表示只要 key 对应的 value 在列表中就可以
label:边的类型,选填项,默认代表所有 edge label
direction:起始顶点向外发散的方向(OUT,IN,BOTH),选填项,默认是 BOTH
min_neighbors:最少邻居数目,邻居数目少于这个阈值时,认为起点不具备"梭形相似点"。比如想要找一个"读者 A"读过的书的"梭形相似点",那么min_neighbors为 100 时,表示"读者 A"至少要读过 100 本书才可以有"梭形相似点",必填项
alpha:相似度,代表:起点与"梭形相似点"的共同邻居数目占起点的全部邻居数目的比例,必填项
min_similars:“梭形相似点"的最少个数,只有当起点的"梭形相似点"数目大于或等于该值时,才会返回起点及其"梭形相似点”,选填项,默认值为 1
top:返回一个起点的"梭形相似点"中相似度最高的 top 个,必填项,0 表示全部
group_property:与min_groups一起使用,当起点跟其所有的"梭形相似点"某个属性的值有至少min_groups个不同值时,才会返回该起点及其"梭形相似点"。比如为"读者 A"推荐"异地"书友时,需要设置group_property为读者的"城市"属性,min_group至少为 2,选填项,不填代表不需要根据属性过滤
min_groups:与group_property一起使用,只有group_property设置时才有意义
max_degree:查询过程中,单个顶点遍历的最大邻接边数目,选填项,默认为 10000
capacity:遍历过程中最大的访问的顶点数目,选填项,默认为 10000000
limit:返回的结果数目上限(一个起点及其"梭形相似点"算一个结果),选填项,默认为 10
with_intermediary:是否返回起点及其"梭形相似点"共同关联的中间点,默认为 false
with_vertex,选填项,默认为 false:
true 表示返回结果包含完整的顶点信息 false 时表示只返回顶点 id 3.2.21.2 使用方法 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/traversers/fusiformsimilarityRequest Body {
"sources" :{
"ids" :[],
"label" : "person" ,
"properties" : {
"name" : "p1"
}
},
"label" : "read" ,
"direction" : "OUT" ,
"min_neighbors" : 8 ,
"alpha" : 0.75 ,
"min_similars" : 1 ,
"top" : 0 ,
"group_property" : "city" ,
"min_group" : 2 ,
"max_degree" : 10000 ,
"capacity" : -1 ,
"limit" : -1 ,
"with_intermediary" : false ,
"with_vertex" : true
} Response Status Response Body {
"similars" : {
"3:p1" : [
{
"id" : "3:p2" ,
"score" : 0.8888888888888888 ,
"intermediaries" : [
]
},
{
"id" : "3:p3" ,
"score" : 0.7777777777777778 ,
"intermediaries" : [
]
}
]
},
"vertices" : [
{
"id" : "3:p1" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "p1" ,
"city" : "Beijing"
}
},
{
"id" : "3:p2" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "p2" ,
"city" : "Shanghai"
}
},
{
"id" : "3:p3" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"name" : "p3" ,
"city" : "Beijing"
}
}
]
} 3.2.21.3 适用场景 查询一组顶点相似度很高的顶点。例如:
跟一个读者有类似书单的读者 跟一个玩家玩类似游戏的玩家 3.2.22 Vertices 3.2.22.1 根据顶点的 id 列表,批量查询顶点 Params Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/traversers/vertices?ids="1:marko"&ids="2:lop"Response Status Response Body {
"vertices" :[
{
"id" : "1:marko" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" :{
"city" :[
{
"id" : "1:marko>city" ,
"value" : "Beijing"
}
],
"name" :[
{
"id" : "1:marko>name" ,
"value" : "marko"
}
],
"age" :[
{
"id" : "1:marko>age" ,
"value" : 29
}
]
}
},
{
"id" : "2:lop" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" :{
"price" :[
{
"id" : "2:lop>price" ,
"value" : 328
}
],
"name" :[
{
"id" : "2:lop>name" ,
"value" : "lop"
}
],
"lang" :[
{
"id" : "2:lop>lang" ,
"value" : "java"
}
]
}
}
]
} 3.2.22.2 获取顶点 Shard 信息 通过指定的分片大小 split_size,获取顶点分片信息(可以与 3.2.21.3 中的 Scan 配合使用来获取顶点)。
Params Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/traversers/vertices/shards?split_size=67108864Response Status Response Body {
"shards" :[
{
"start" : "0" ,
"end" : "2165893" ,
"length" : 0
},
{
"start" : "2165893" ,
"end" : "4331786" ,
"length" : 0
},
{
"start" : "4331786" ,
"end" : "6497679" ,
"length" : 0
},
{
"start" : "6497679" ,
"end" : "8663572" ,
"length" : 0
},
......
]
} 3.2.22.3 根据 Shard 信息批量获取顶点 通过指定的分片信息批量查询顶点(Shard 信息的获取参见 3.2.21.2 Shard)。
Params start:分片起始位置,必填项 end:分片结束位置,必填项 page:分页位置,选填项,默认为 null,不分页;当 page 为“”时表示分页的第一页,从 start 指示的位置开始 page_limit:分页获取顶点时,一页中顶点数目的上限,选填项,默认为 100000 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/traversers/vertices/scan?start=0&end=4294967295Response Status Response Body {
"vertices" :[
{
"id" : "2:ripple" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" :{
"price" :[
{
"id" : "2:ripple>price" ,
"value" : 199
}
],
"name" :[
{
"id" : "2:ripple>name" ,
"value" : "ripple"
}
],
"lang" :[
{
"id" : "2:ripple>lang" ,
"value" : "java"
}
]
}
},
{
"id" : "1:vadas" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" :{
"city" :[
{
"id" : "1:vadas>city" ,
"value" : "Hongkong"
}
],
"name" :[
{
"id" : "1:vadas>name" ,
"value" : "vadas"
}
],
"age" :[
{
"id" : "1:vadas>age" ,
"value" : 27
}
]
}
},
{
"id" : "1:peter" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" :{
"city" :[
{
"id" : "1:peter>city" ,
"value" : "Shanghai"
}
],
"name" :[
{
"id" : "1:peter>name" ,
"value" : "peter"
}
],
"age" :[
{
"id" : "1:peter>age" ,
"value" : 35
}
]
}
},
{
"id" : "1:josh" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" :{
"city" :[
{
"id" : "1:josh>city" ,
"value" : "Beijing"
}
],
"name" :[
{
"id" : "1:josh>name" ,
"value" : "josh"
}
],
"age" :[
{
"id" : "1:josh>age" ,
"value" : 32
}
]
}
},
{
"id" : "1:marko" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" :{
"city" :[
{
"id" : "1:marko>city" ,
"value" : "Beijing"
}
],
"name" :[
{
"id" : "1:marko>name" ,
"value" : "marko"
}
],
"age" :[
{
"id" : "1:marko>age" ,
"value" : 29
}
]
}
},
{
"id" : "2:lop" ,
"label" : "software" ,
"type" : "vertex" ,
"properties" :{
"price" :[
{
"id" : "2:lop>price" ,
"value" : 328
}
],
"name" :[
{
"id" : "2:lop>name" ,
"value" : "lop"
}
],
"lang" :[
{
"id" : "2:lop>lang" ,
"value" : "java"
}
]
}
}
]
} 3.2.22.4 适用场景 按 id 列表查询顶点,可用于批量查询顶点,比如在 path 查询到多条路径之后,可以进一步查询某条路径的所有顶点属性。 获取分片和按分片查询顶点,可以用来遍历全部顶点 3.2.23 Edges 3.2.23.1 根据边的 id 列表,批量查询边 Params Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/traversers/edges?ids="S1:josh>1>>S2:lop"&ids="S1:josh>1>>S2:ripple"Response Status Response Body {
"edges" : [
{
"id" : "S1:josh>1>>S2:lop" ,
"label" : "created" ,
"type" : "edge" ,
"inVLabel" : "software" ,
"outVLabel" : "person" ,
"inV" : "2:lop" ,
"outV" : "1:josh" ,
"properties" : {
"date" : "20091111" ,
"weight" : 0.4
}
},
{
"id" : "S1:josh>1>>S2:ripple" ,
"label" : "created" ,
"type" : "edge" ,
"inVLabel" : "software" ,
"outVLabel" : "person" ,
"inV" : "2:ripple" ,
"outV" : "1:josh" ,
"properties" : {
"date" : "20171210" ,
"weight" : 1
}
}
]
} 3.2.23.2 获取边 Shard 信息 通过指定的分片大小 split_size,获取边分片信息(可以与 3.2.22.3 中的 Scan 配合使用来获取边)。
Params Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/traversers/edges/shards?split_size=4294967295Response Status Response Body {
"shards" :[
{
"start" : "0" ,
"end" : "1073741823" ,
"length" : 0
},
{
"start" : "1073741823" ,
"end" : "2147483646" ,
"length" : 0
},
{
"start" : "2147483646" ,
"end" : "3221225469" ,
"length" : 0
},
{
"start" : "3221225469" ,
"end" : "4294967292" ,
"length" : 0
},
{
"start" : "4294967292" ,
"end" : "4294967295" ,
"length" : 0
}
]
} 3.2.23.3 根据 Shard 信息批量获取边 通过指定的分片信息批量查询边(Shard 信息的获取参见 3.2.22.2)。
Params start:分片起始位置,必填项 end:分片结束位置,必填项 page:分页位置,选填项,默认为 null,不分页;当 page 为“”时表示分页的第一页,从 start 指示的位置开始 page_limit:分页获取边时,一页中边数目的上限,选填项,默认为 100000 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/traversers/edges/scan?start=0&end=3221225469Response Status Response Body {
"edges" :[
{
"id" : "S1:peter>2>>S2:lop" ,
"label" : "created" ,
"type" : "edge" ,
"inVLabel" : "software" ,
"outVLabel" : "person" ,
"inV" : "2:lop" ,
"outV" : "1:peter" ,
"properties" :{
"weight" : 0.2 ,
"date" : "20170324"
}
},
{
"id" : "S1:josh>2>>S2:lop" ,
"label" : "created" ,
"type" : "edge" ,
"inVLabel" : "software" ,
"outVLabel" : "person" ,
"inV" : "2:lop" ,
"outV" : "1:josh" ,
"properties" :{
"weight" : 0.4 ,
"date" : "20091111"
}
},
{
"id" : "S1:josh>2>>S2:ripple" ,
"label" : "created" ,
"type" : "edge" ,
"inVLabel" : "software" ,
"outVLabel" : "person" ,
"inV" : "2:ripple" ,
"outV" : "1:josh" ,
"properties" :{
"weight" : 1 ,
"date" : "20171210"
}
},
{
"id" : "S1:marko>1>20130220>S1:josh" ,
"label" : "knows" ,
"type" : "edge" ,
"inVLabel" : "person" ,
"outVLabel" : "person" ,
"inV" : "1:josh" ,
"outV" : "1:marko" ,
"properties" :{
"weight" : 1 ,
"date" : "20130220"
}
},
{
"id" : "S1:marko>1>20160110>S1:vadas" ,
"label" : "knows" ,
"type" : "edge" ,
"inVLabel" : "person" ,
"outVLabel" : "person" ,
"inV" : "1:vadas" ,
"outV" : "1:marko" ,
"properties" :{
"weight" : 0.5 ,
"date" : "20160110"
}
},
{
"id" : "S1:marko>2>>S2:lop" ,
"label" : "created" ,
"type" : "edge" ,
"inVLabel" : "software" ,
"outVLabel" : "person" ,
"inV" : "2:lop" ,
"outV" : "1:marko" ,
"properties" :{
"weight" : 0.4 ,
"date" : "20171210"
}
}
]
} 3.2.23.4 适用场景 按 id 列表查询边,可用于批量查询边 获取分片和按分片查询边,可以用来遍历全部边 3.2.24 Adamic-Adar 3.2.24.1 功能介绍 计算两个顶点的 Adamic-Adar 指标,即每个共同邻居的度取对数后倒数之和。
Params vertex:一个顶点 id,必填项 other:另一个顶点 id,必填项,不能与 vertex 相同 direction:顶点向外发散的方向(OUT,IN,BOTH),选填项,默认是 BOTH label:边的类型,选填项,默认代表所有 edge label max_degree:查询过程中,单个顶点遍历的最大邻接边数目,选填项,默认为 10000 limit:参与计算的共同邻居的最大数目,选填项,默认为 10000000 3.2.24.2 使用方法 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/adamicadar?vertex="1:marko"&other="1:josh"Response Status Response Body 度为 0 的共同邻居会被跳过,因此两个顶点没有共同邻居时结果为 0.0。
{
"adamic_adar" : 0.9102392266268373
} 3.2.24.3 适用场景 预测两个顶点之间是否可能出现连边,其中冷门的共同邻居比热门的共同邻居权重更高。
3.2.25 Resource Allocation 3.2.25.1 功能介绍 计算两个顶点的资源分配指标,即每个共同邻居的度的倒数之和。
Params vertex:一个顶点 id,必填项 other:另一个顶点 id,必填项,不能与 vertex 相同 direction:顶点向外发散的方向(OUT,IN,BOTH),选填项,默认是 BOTH label:边的类型,选填项,默认代表所有 edge label max_degree:查询过程中,单个顶点遍历的最大邻接边数目,选填项,默认为 10000 limit:参与计算的共同邻居的最大数目,选填项,默认为 10000000 3.2.25.2 使用方法 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/resourceallocation?vertex="1:marko"&other="1:josh"Response Status Response Body {
"resource_allocation" : 0.3333333333333333
} 3.2.25.3 适用场景 连边预测,相比 Adamic-Adar 对高度数的共同邻居惩罚更强。
3.2.26 Edge Existence 3.2.26.1 功能介绍 查询起点和终点之间存在的边。
Params source:起始顶点 id,必填项 target:目标顶点 id,必填项 label:边的类型,选填项,默认代表所有 edge label sort_values:排序键的取值,当 edge label 的 frequency 为 MULTIPLE 时用于从多条平行边中选定一条,选填项,默认为空字符串 limit:返回的边的最大数目,选填项,默认为 100 3.2.26.2 使用方法 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/edgeexist?source="1:marko"&target="2:lop"Response Status Response Body {
"edges" :[
{
"id" : "S1:marko>2>>S2:lop" ,
"label" : "created" ,
"type" : "edge" ,
"inVLabel" : "software" ,
"outVLabel" : "person" ,
"inV" : "2:lop" ,
"outV" : "1:marko" ,
"properties" :{
"weight" : 0.4 ,
"date" : "20171210"
}
}
]
} 3.2.26.3 适用场景 判断两个顶点之间是否直接相连,并在一次请求中拿到连接边的属性。
3.2.27 Count 3.2.27.1 功能介绍 统计从起始顶点出发,经过若干步遍历后可达的顶点数量,不返回顶点本身。
Params source:起始顶点 id,必填项 steps:遍历的步骤,必填项,每个 step 支持以下字段:direction:顶点向外发散的方向(OUT,IN,BOTH),选填项,默认是 BOTH labels:当前 step 的边类型列表,选填项,默认代表所有 edge label properties:当前 step 的边属性过滤条件,选填项 max_degree:当前 step 中单个顶点遍历的最大邻接边数目,选填项,默认为 10000 skip_degree:当前 step 中跳过超级点的阈值,选填项,默认为 100000 contains_traversed:是否把中间各步到达的顶点也计入结果,选填项,默认为 false dedup_size:用于去重的顶点数上限,-1 表示不限制,选填项,默认为 1000000 3.2.27.2 使用方法 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/{graph}/traversers/countRequest Body {
"source" : "1:marko" ,
"steps" : [
{
"direction" : "BOTH" ,
"labels" : [],
"max_degree" : 100 ,
"skip_degree" : 100
},
{
"direction" : "BOTH" ,
"labels" : [],
"max_degree" : 100 ,
"skip_degree" : 100
},
{
"direction" : "BOTH" ,
"labels" : [],
"max_degree" : 100 ,
"skip_degree" : 100
}
]
} Response Status Response Body 3.2.27.3 适用场景 只关心多步邻居的规模时使用,避免序列化和传输大量顶点。
1.11 - Rank API Rank(图排序)REST 接口:执行图节点排序算法,如 PageRank、个性化 PageRank 等中心性分析。
4.1 rank API 概述 HugeGraphServer 除了上一节提到的遍历(traverser)方法,还提供了一类专门做推荐的方法,我们称为rank API,
可在图中为一个点推荐与其关系密切的其它点。
4.2 rank API 详解 4.2.1 Personal Rank API Personal Rank 算法典型场景是用于推荐应用中,根据某个点现有的出边,推荐具有相近 / 相同关系的其他点,
比如根据某个人的阅读记录 / 习惯,向它推荐其他可能感兴趣的书,或潜在的书友,举例如下:
假设给定 1 个 Person 点 是 tom, 它喜欢 a,b,c,d,e 5 本书,我们的想给 tom 推荐一些书友,以及一些书,最容易的想法就是看看还有哪些人喜欢过这些书 (共同兴趣) 那么此时,需要有其它的 Person 点比如 neo, 他喜欢 b,d,f 3 本书,以及 jay, 它喜欢 c,d,e,g 4 本书,lee 它喜欢 a,d,e,f 4 本书 由于 tom 已经看过的书不需要重复推荐,所以返回结果里应该期望推荐有共同喜好的其他书友看过,但 tom 没看过的书,比如推荐 “f” 和 “g” 书,且优先级 f > g 此时再计算 tom 的个性化 rank 值,就会返回排序后 TopN 推荐的 书友 + 书 的结果了 (如果只需要推荐的书,选择 OTHER_LABEL 即可) 4.2.1.0 数据准备 上面是一个简单的例子,这里再提供一个公开的 1MB 测试数据集 MovieLens 为例,
用户需下载该数据集,然后使用 HugeGraph-Loader 导入到 HugeGraph 中,简单起见,数据中顶点 user
和 movie 的属性都忽略,仅使用 id 字段即可,边 rating 的具体评分值也忽略。loader 使用的元数据
文件和输入源映射文件内容如下:
////////////////////////////////////////////////////////////
// UserID::Gender::Age::Occupation::Zip-code
// MovieID::Title::Genres
// UserID::MovieID::Rating::Timestamp
////////////////////////////////////////////////////////////
// Define schema
schema . propertyKey ( "id" ). asInt (). ifNotExist (). create ();
schema . propertyKey ( "rate" ). asInt (). ifNotExist (). create ();
schema . vertexLabel ( "user" )
. properties ( "id" )
. primaryKeys ( "id" )
. ifNotExist ()
. create ();
schema . vertexLabel ( "movie" )
. properties ( "id" )
. primaryKeys ( "id" )
. ifNotExist ()
. create ();
schema . edgeLabel ( "rating" )
. sourceLabel ( "user" )
. targetLabel ( "movie" )
. properties ( "rate" )
. ifNotExist ()
. create (); {
"vertices" : [
{
"label" : "user" ,
"input" : {
"type" : "file" ,
"path" : "users.dat" ,
"format" : "TEXT" ,
"delimiter" : "::" ,
"header" : [ "UserID" , "Gender" , "Age" , "Occupation" , "Zip-code" ]
},
"ignored" : [ "Gender" , "Age" , "Occupation" , "Zip-code" ],
"mapping" : {
"UserID" : "id"
}
},
{
"label" : "movie" ,
"input" : {
"type" : "file" ,
"path" : "movies.dat" ,
"format" : "TEXT" ,
"delimiter" : "::" ,
"header" : [ "MovieID" , "Title" , "Genres" ]
},
"ignored" : [ "Title" , "Genres" ],
"mapping" : {
"MovieID" : "id"
}
}
],
"edges" : [
{
"label" : "rating" ,
"source" : [ "UserID" ],
"target" : [ "MovieID" ],
"input" : {
"type" : "file" ,
"path" : "ratings.dat" ,
"format" : "TEXT" ,
"delimiter" : "::" ,
"header" : [ "UserID" , "MovieID" , "Rating" , "Timestamp" ]
},
"ignored" : [ "Timestamp" ],
"mapping" : {
"UserID" : "id" ,
"MovieID" : "id" ,
"Rating" : "rate"
}
}
]
} 注意将映射文件中input.path的值修改为自己本地的路径。
4.2.1.1 功能介绍 适用于二分图,给出所有源顶点相关的其他顶点及其相关性组成的列表。
二分图:也称二部图,是图论里的一种特殊模型,也是一种特殊的网络流。其最大的特点在于,可以将图里的顶点分为两个集合,两个集合之间的点有边相连,但集合内的点之间没有直接关联。
假设有一个用户和物品的二分图,基于随机游走的 PersonalRank 算法步骤如下:
选定一个起点用户 u,其初始权重为 1.0,从 Vu 开始游走(有 alpha 的概率走到邻居点,1 - alpha 的概率停留); 如果决定向外游走,那么会选取某一个类型的出边,例如 rating 来查找共同的打分人:那就从当前节点的邻居节点中按照均匀分布随机选择一个,并且按照均匀分布划分权重值; 给源顶点补偿权重 1 - alpha; 重复步骤 2; 达到一定步数或达到精度后收敛,得到推荐列表。 Params 必填项 :
source: 源顶点 id label: 源点出发的某类边 label,须连接两类不同顶点 选填项 :
alpha:每轮迭代时从某个点往外走的概率,与 PageRank 算法中的 alpha 类似,取值区间为 (0, 1], 默认值 0.85 max_degree: 查询过程中,单个顶点遍历的最大邻接边数目,默认为 10000 max_depth: 迭代次数,取值区间为 [2, 5000], 默认值 5 with_label:筛选结果中保留哪些结果,可选以下三类,默认为 BOTH_LABELSAME_LABEL:仅保留与源顶点相同类别的顶点 OTHER_LABEL:仅保留与源顶点不同类别(二分图的另一端)的顶点 BOTH_LABEL:同时保留与源顶点相同和相反类别的顶点 limit: 返回的顶点的最大数目,默认为 100 max_diff: 提前收敛的精度差,默认为 0.0001 (后续实现 ) sorted:返回的结果是否根据 rank 排序,为 true 时降序排列,反之不排序,默认为 true 4.2.1.2 使用方法 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/traversers/personalrankRequest Body {
"source" : "1:1" ,
"label" : "rating" ,
"alpha" : 0.6 ,
"max_depth" : 15 ,
"with_label" : "OTHER_LABEL" ,
"sorted" : true ,
"limit" : 10
} Response Status Response Body {
"2:2858" : 0.0005014026017816927 ,
"2:1196" : 0.0004336708357653617 ,
"2:1210" : 0.0004128083140214213 ,
"2:593" : 0.00038117341069881513 ,
"2:480" : 0.00037005373269728036 ,
"2:1198" : 0.000366641614652057 ,
"2:2396" : 0.0003622362410538888 ,
"2:2571" : 0.0003593312457300953 ,
"2:589" : 0.00035922123055598566 ,
"2:110" : 0.0003466135844390885
} 4.2.1.3 适用场景 两类不同顶点连接形成的二分图中,给某个点推荐相关性最高的其他顶点,例如:
阅读推荐: 找出优先给某人推荐的其他书籍 , 也可以同时推荐共同喜好最高的书友 (例: 微信 “你的好友也在看 xx 文章” 功能) 社交推荐: 找出拥有相同关注话题的其他博主 , 也可以推荐可能感兴趣的新闻/消息 (例: Weibo 中的 “热点推荐” 功能) 商品推荐: 通过某人现在的购物习惯, 找出应优先推给它的商品列表 , 也可以给它推荐带货 播主 (例: TaoBao 的 “猜你喜欢” 功能) 4.2.2 Neighbor Rank API 4.2.2.0 数据准备 public class Loader {
public static void main ( String [] args ) {
HugeClient client = new HugeClient ( "http://127.0.0.1:8080" , "hugegraph" );
SchemaManager schema = client . schema ();
schema . propertyKey ( "name" ). asText (). ifNotExist (). create ();
schema . vertexLabel ( "person" )
. properties ( "name" )
. useCustomizeStringId ()
. ifNotExist ()
. create ();
schema . vertexLabel ( "movie" )
. properties ( "name" )
. useCustomizeStringId ()
. ifNotExist ()
. create ();
schema . edgeLabel ( "follow" )
. sourceLabel ( "person" )
. targetLabel ( "person" )
. ifNotExist ()
. create ();
schema . edgeLabel ( "like" )
. sourceLabel ( "person" )
. targetLabel ( "movie" )
. ifNotExist ()
. create ();
schema . edgeLabel ( "directedBy" )
. sourceLabel ( "movie" )
. targetLabel ( "person" )
. ifNotExist ()
. create ();
GraphManager graph = client . graph ();
Vertex O = graph . addVertex ( T . label , "person" , T . id , "O" , "name" , "O" );
Vertex A = graph . addVertex ( T . label , "person" , T . id , "A" , "name" , "A" );
Vertex B = graph . addVertex ( T . label , "person" , T . id , "B" , "name" , "B" );
Vertex C = graph . addVertex ( T . label , "person" , T . id , "C" , "name" , "C" );
Vertex D = graph . addVertex ( T . label , "person" , T . id , "D" , "name" , "D" );
Vertex E = graph . addVertex ( T . label , "movie" , T . id , "E" , "name" , "E" );
Vertex F = graph . addVertex ( T . label , "movie" , T . id , "F" , "name" , "F" );
Vertex G = graph . addVertex ( T . label , "movie" , T . id , "G" , "name" , "G" );
Vertex H = graph . addVertex ( T . label , "movie" , T . id , "H" , "name" , "H" );
Vertex I = graph . addVertex ( T . label , "movie" , T . id , "I" , "name" , "I" );
Vertex J = graph . addVertex ( T . label , "movie" , T . id , "J" , "name" , "J" );
Vertex K = graph . addVertex ( T . label , "person" , T . id , "K" , "name" , "K" );
Vertex L = graph . addVertex ( T . label , "person" , T . id , "L" , "name" , "L" );
Vertex M = graph . addVertex ( T . label , "person" , T . id , "M" , "name" , "M" );
O . addEdge ( "follow" , A );
O . addEdge ( "follow" , B );
O . addEdge ( "follow" , C );
D . addEdge ( "follow" , O );
A . addEdge ( "follow" , B );
A . addEdge ( "like" , E );
A . addEdge ( "like" , F );
B . addEdge ( "like" , G );
B . addEdge ( "like" , H );
C . addEdge ( "like" , I );
C . addEdge ( "like" , J );
E . addEdge ( "directedBy" , K );
F . addEdge ( "directedBy" , B );
F . addEdge ( "directedBy" , L );
G . addEdge ( "directedBy" , M );
}
} 4.2.2.1 功能介绍 在一般图结构中,找出每一层与给定起点相关性最高的前 N 个顶点及其相关度,用图的语义理解就是:从起点往外走,
走到各层各个顶点的概率。
Params source: 源顶点 id,必填项 alpha:每轮迭代时从某个点往外走的概率,与 PageRank 算法中的 alpha 类似,必填项,取值区间为 (0, 1] steps: 表示从起始顶点走过的路径规则,是一组 Step 的列表,每个 Step 对应结果中的一层,必填项。每个 Step 的结构如下:direction:表示边的方向(OUT, IN, BOTH),默认是 BOTH labels:边的类型列表,多个边类型取并集 max_degree:查询过程中,单个顶点遍历的最大邻接边数目,默认为 10000 (注:0.12 版之前 step 内仅支持 degree 作为参数名,0.12 开始统一使用 max_degree, 并向下兼容 degree 写法) skip_degree:当前层跳过超级点的阈值,默认为 0,表示不跳过 top:在结果中每一层只保留权重最高的前 N 个结果,默认为 10,最大值为 1000 capacity: 遍历过程中最大的访问的顶点数目,选填项,默认为 10000000 4.2.2.2 使用方法 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/traversers/neighborrankRequest Body {
"source" : "O" ,
"steps" :[
{
"direction" : "OUT" ,
"labels" :[
"follow"
],
"max_degree" : -1 ,
"top" : 100
},
{
"direction" : "OUT" ,
"labels" :[
"follow" ,
"like"
],
"max_degree" : -1 ,
"top" : 100
},
{
"direction" : "OUT" ,
"labels" :[
"directedBy"
],
"max_degree" : -1 ,
"top" : 100
}
],
"alpha" : 0.9 ,
"capacity" : -1
} Response Status Response Body {
"ranks" : [
{
"O" : 1
},
{
"B" : 0.4305 ,
"A" : 0.3 ,
"C" : 0.3
},
{
"G" : 0.17550000000000002 ,
"H" : 0.17550000000000002 ,
"I" : 0.135 ,
"J" : 0.135 ,
"E" : 0.09000000000000001 ,
"F" : 0.09000000000000001
},
{
"M" : 0.15795 ,
"K" : 0.08100000000000002 ,
"L" : 0.04050000000000001
}
]
} 4.2.2.3 适用场景 为给定的起点在不同的层中找到最应该推荐的顶点。
比如:在观众、朋友、电影、导演的四层图结构中,根据某个观众的朋友们喜欢的电影,为这个观众推荐电影;或者根据这些电影是谁拍的,为其推荐导演。 1.12 - Variable API Variable(变量)REST 接口:存储和管理键值对形式的全局变量,支持图级别的配置和状态管理。
5.1 Variables Variables 可以用来存储有关整个图的数据,数据按照键值对的方式存取
5.1.1 创建或者更新某个键值对 Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/variables/nameRequest Body Response Status Response Body 5.1.2 列出全部键值对 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/variablesResponse Status Response Body 5.1.3 列出某个键值对 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/variables/nameResponse Status Response Body 5.1.4 删除某个键值对 Method & Url DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/variables/nameResponse Status 1.13 - Graphs API Graphs(图管理)REST 接口:管理图实例的生命周期,包括创建、查询、克隆、清空和删除图数据库。
6.1 Graphs 重要提醒 :1.7.0 及之后,动态创建图必须开启鉴权模式。非鉴权模式请参考图配置文件 ,通过配置文件静态创建图。
6.1.1 列出图空间中全部的图 Params 路径参数说明:
Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphsResponse Status Response Body {
"graphs" : [
"hugegraph" ,
"hugegraph1"
]
} 6.1.2 查看某个图的信息 Params 路径参数说明:
graphspace: 图空间名称 graph: 图名称 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraphResponse Status Response Body {
"name" : "hugegraph" ,
"backend" : "rocksdb"
} 6.1.3 清空某个图的全部数据,包括 schema、vertex、edge 和 index 等,该操作需要管理员权限 Params 路径参数说明:
graphspace: 图空间名称 graph: 图名称 请求参数说明:
由于清空图是一个比较危险的操作,为避免用户误调用,我们给 API 添加了用于确认的参数:
confirm_message: 默认为I'm sure to delete all data Method & Url DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/clear?confirm_message=I%27m+sure+to+delete+all+dataResponse Status 6.1.4 克隆一个图 (管理员权限 ) Params 路径参数说明:
graphspace: 图空间名称 graph: 要创建的新图名称 请求参数说明:
clone_graph_name: 已有图的名称;从已有的图来克隆,用户可选择传递配置文件,传递时将替换已有图中的配置; Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/cloneGraph?clone_graph_name=hugegraphRequest Body (可选) 克隆一个非鉴权模式的图(设置 Content-Type: application/json)
{
"gremlin.graph" : "org.apache.hugegraph.HugeFactory" ,
"backend" : "rocksdb" ,
"serializer" : "binary" ,
"store" : "cloneGraph" ,
"rocksdb.data_path" : "./rks-data-xx" ,
"rocksdb.wal_path" : "./rks-data-xx"
} Note:
Rocksdb 存储路径不能与现有图相同(需使用不同的目录) 如需开启新图的权限系统,需替换设置 gremlin.graph=org.apache.hugegraph.auth.HugeFactoryAuthProxy Response Status Response Body {
"name" : "cloneGraph" ,
"nickname" : "cloneGraph" ,
"backend" : "rocksdb" ,
"description" : ""
} 6.1.5 创建一个图,该操作需要管理员权限 Params 路径参数说明:
graphspace: 图空间名称 graph: 图名称 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph-xxRequest Body 创建一个图(设置 Content-Type: application/json)
gremlin.graph 配置说明:
鉴权模式:"gremlin.graph": "org.apache.hugegraph.auth.HugeFactoryAuthProxy"(推荐) 非鉴权模式:"gremlin.graph": "org.apache.hugegraph.HugeFactory" 注意 !!
在 1.7.0 版本中,动态创建图会导致 NPE 错误。该问题已在 PR#2912 中修复。当前 master 版本和 1.7.0 之前的版本不受此问题影响。 如果 backend 是 hstore,请确保 HugeGraph-Server 已正确配置 PD,参见 HStore 配置 。1.7.0 及之前版本还需要在请求体中设置 "task.scheduler_type": "distributed",该配置项现已废弃并被忽略:调度器由后端类型决定,hstore 使用分布式调度器,其他后端使用本地调度器。 选填字段及其默认值:
gremlin.graph 默认为 org.apache.hugegraph.HugeFactorybackend 在 PD 模式下默认为 hstore,否则默认为 rocksdbserializer 默认为 binarystore 默认为图名称nickname 设置图的显示名,在图空间内必须唯一schema 指定初始化该图所用的 schema 模板 ,会被保存为 schema.init_templatedescription 会原样返回在响应中RocksDB 示例:
{
"gremlin.graph" : "org.apache.hugegraph.auth.HugeFactoryAuthProxy" ,
"backend" : "rocksdb" ,
"serializer" : "binary" ,
"store" : "hugegraph" ,
"rocksdb.data_path" : "./rks-data-xx" ,
"rocksdb.wal_path" : "./rks-data-xx"
} HStore 示例:
{
"gremlin.graph" : "org.apache.hugegraph.auth.HugeFactoryAuthProxy" ,
"backend" : "hstore" ,
"serializer" : "binary" ,
"store" : "hugegraph2" ,
"pd.peers" : "127.0.0.1:8686"
} Note: Rocksdb 存储路径不能与现有图相同(需使用不同的目录)
Response Status Response Body {
"name" : "hugegraph2" ,
"nickname" : "hugegraph2" ,
"backend" : "rocksdb" ,
"description" : ""
} 6.1.6 删除某个图及其全部数据 Params 路径参数说明:
graphspace: 图空间名称 graph: 图名称 请求参数说明:
由于删除图是一个比较危险的操作,为避免用户误调用,我们给 API 添加了用于确认的参数:
confirm_message: 默认为I'm sure to drop the graph Method & Url DELETE http : //localhost:8080/graphspaces/DEFAULT/graphs/graphA?confirm_message=I%27m%20sure%20to%20drop%20the%20graph
Response Status 注意:对于 HugeGraph 1.5.0 及之前版本,如需创建或删除图,请继续使用旧的 text/plain(properties)格式请求体,而不是 JSON。
6.1.7 列出图空间中全部的图及其配置 对当前用户有读权限的每个图返回一条记录,其中包含该图的配置(形如密码、密钥、token、凭证、私钥的配置项会被过滤掉)以及下面这些字段。当前用户的默认图会排在前面。
Params 路径参数说明:
请求参数说明:
prefix: 只返回名称或显示名以该前缀开头的图 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/profileResponse Status Response Body default_update_time 只在该图是当前用户的默认图时返回,create_time 只在该图记录了创建时间时返回。
[
{
"backend" : "rocksdb" ,
"serializer" : "binary" ,
"store" : "hugegraph" ,
"name" : "hugegraph" ,
"nickname" : "hugegraph" ,
"graphspace_nickname" : "DEFAULT" ,
"default" : true ,
"default_update_time" : "2024-05-01 12:30:00" ,
"create_time" : "2024-05-01 12:00:00"
}
] 6.1.8 修改某个图的显示名,该操作需要管理员权限 Params 路径参数说明:
graphspace: 图空间名称 graph: 图名称 请求参数说明:
action: 固定为 update update: 需要修改的字段。name 必填且必须与路径中的图名一致,nickname 是新的显示名,在图空间内必须唯一。 Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraphRequest Body {
"action" : "update" ,
"update" : {
"name" : "hugegraph" ,
"nickname" : "MyGraph"
}
} Response Status Response Body {
"hugegraph" : "updated"
} 6.1.9 管理当前用户的默认图 默认图是按用户记录的,因此下面的接口都以调用者的身份生效。它们依赖权限系统,未开启权限的单机模式下会返回 400 和 GraphSpace management is not supported in standalone mode。
设置默认图 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/defaultResponse Status Response Body {
"default_graph" : [
"hugegraph"
]
} 取消默认图 Method & Url DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/defaultResponse Status Response Body 查看默认图 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/defaultResponse Status Response Body {
"default_graph" : [
"hugegraph"
]
} 6.1.10 重新加载图空间中的图 重新加载服务中的图,适用于图配置在服务外部被改动之后。
Params 路径参数说明:
请求参数说明:
Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/graphs/manageRequest Body Response Status Response Body 6.2 Conf 6.2.1 查看某个图的配置,该操作需要管理员权限 Method & Url GET
http : //localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/conf
Response Status Response Body # gremlin entrence to create graph
gremlin.graph = org.apache.hugegraph.HugeFactory
# cache config
#schema.cache_capacity=1048576
#graph.cache_capacity=10485760
#graph.cache_expire=600
# schema illegal name template
#schema.illegal_name_regex=\s+|~.*
#vertex.default_label=vertex
backend = rocksdb
serializer = binary
store = hugegraph
... = 6.3 Mode 合法的图模式包括:NONE,RESTORING,MERGING,LOADING
None 模式(默认),元数据和图数据的写入属于正常状态。特别的:元数据(schema)创建时不允许指定 ID 图数据(vertex)在 id strategy 为 Automatic 时,不允许指定 ID LOADING:批量导入数据时自动启用,特别的: Restore 时存在两种不同的模式:Restoring 和 Merging
Restoring 模式,恢复到一个新图中,特别的:元数据(schema)创建时允许指定 ID 图数据(vertex)在 id strategy 为 Automatic 时,允许指定 ID Merging 模式,合并到一个已存在元数据和图数据的图中,特别的:元数据(schema)创建时不允许指定 ID 图数据(vertex)在 id strategy 为 Automatic 时,允许指定 ID 正常情况下,图模式为 None,当需要 Restore 图时,需要根据需要临时修改图模式为 Restoring 模式或者 Merging
模式,并在完成 Restore 时,恢复图模式为 None。
6.3.1 查看某个图的模式。 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/modeResponse Status Response Body 合法的图模式包括:NONE,RESTORING,MERGING,LOADING
6.3.2 设置某个图的模式。该操作需要管理员权限 Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/modeRequest Body 合法的图模式包括:NONE,RESTORING,MERGING,LOADING
Response Status Response Body 6.3.3 查看某个图的读模式。 Params Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/graph_read_modeResponse Status Response Body {
"graph_read_mode" : "ALL"
} 6.3.4 设置某个图的读模式。该操作需要管理员权限 Params Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/graph_read_modeRequest Body 合法的读模式包括:ALL,OLTP_ONLY。传入 OLAP_ONLY 时接口会报错 Graph-read-mode could be ALL or OLTP_ONLY。
Response Status Response Body {
"graph_read_mode" : "OLTP_ONLY"
} 6.4 Snapshot 6.4.1 创建快照 Params Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/snapshot_createResponse Status Response Body {
"hugegraph" : "snapshot_created"
} 6.4.2 快照恢复 Params Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/snapshot_resumeResponse Status Response Body {
"hugegraph" : "snapshot_resumed"
} 6.5 Compact 6.5.1 手动压缩图,该操作需要管理员权限 Params Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/compactResponse Status Response Body {
"nodes" : 1 ,
"cluster_id" : "local" ,
"servers" : {
"local" : "OK"
}
} 6.6 Raft 以下接口只在图运行于 raft 模式时可用,参见 配置项 中的 raft.mode。未开启 raft 模式的图会返回 400 和 Allowed <operation> operation only when working on raft mode。
Params 路径参数说明:
graphspace: 图空间名称 graph: 图名称 请求参数说明:
group: raft 组名称,默认为 default endpoint: 节点地址,形如 host:port。transfer_leader、set_leader、add_peer 和 remove_peer 必填。 6.6.1 查看 raft 组的成员列表 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/raft/list_peersResponse Status Response Body 返回对象的 key 是 raft 组名称。
{
"default" : [
"127.0.0.1:8281" ,
"127.0.0.1:8282" ,
"127.0.0.1:8283"
]
} 6.6.2 查看 raft 组的 leader Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/raft/get_leaderResponse Status Response Body {
"default" : "127.0.0.1:8281"
} 6.6.3 转移 raft 组的 leader Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/raft/transfer_leader?endpoint=127.0.0.1:8282Response Status Response Body {
"default" : "127.0.0.1:8282"
} 6.6.4 指定 raft 组的 leader Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/raft/set_leader?endpoint=127.0.0.1:8282Response Status Response Body {
"default" : "127.0.0.1:8282"
} 6.6.5 向 raft 组添加成员 该操作会创建一个异步任务,参见 Task API 。
Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/raft/add_peer?endpoint=127.0.0.1:8284Response Status Response Body 6.6.6 从 raft 组移除成员 该操作会创建一个异步任务,参见 Task API 。
Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/raft/remove_peer?endpoint=127.0.0.1:8284Response Status Response Body 1.14 - Task API Task(任务管理)REST 接口:查询和管理异步任务的执行状态,如索引重建、图遍历等长时任务。
7.1 Task 7.1.1 列出某个图中全部的异步任务 Params status: 异步任务的状态,取值为 NEW、SCHEDULING、SCHEDULED、QUEUED、RESTORING、RUNNING、SUCCESS、CANCELLING、CANCELLED、FAILED、HANGING、DELETING 之一,不区分大小写 ids: 需要查询的任务 id,可以重复传多个。不能与 status 或 page 同时使用,并且会忽略 limit limit:返回异步任务数目上限,默认为 100 page: 分页的页标记,传该参数时响应中会带上下一页的 page 字段 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks?status=successResponse Status Response Body {
"tasks" : [{
"task_name" : "hugegraph.traversal().V()" ,
"task_progress" : 0 ,
"task_create" : 1532943976585 ,
"task_status" : "success" ,
"task_update" : 1532943976736 ,
"task_result" : "0" ,
"task_retries" : 0 ,
"id" : 2 ,
"task_type" : "gremlin" ,
"task_callable" : "org.apache.hugegraph.api.job.GremlinAPI$GremlinJob" ,
"task_input" : "{\"gremlin\":\"hugegraph.traversal().V()\",\"bindings\":{},\"language\":\"gremlin-groovy\",\"aliases\":{\"hugegraph\":\"graph\"}}"
}]
} 7.1.2 查看某个异步任务的信息 Params with_result: 是否加载任务的结果,默认为 true Method & Url GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/2Response Status Response Body {
"task_name" : "hugegraph.traversal().V()" ,
"task_progress" : 0 ,
"task_create" : 1532943976585 ,
"task_status" : "success" ,
"task_update" : 1532943976736 ,
"task_result" : "0" ,
"task_retries" : 0 ,
"id" : 2 ,
"task_type" : "gremlin" ,
"task_callable" : "org.apache.hugegraph.api.job.GremlinAPI$GremlinJob" ,
"task_input" : "{\"gremlin\":\"hugegraph.traversal().V()\",\"bindings\":{},\"language\":\"gremlin-groovy\",\"aliases\":{\"hugegraph\":\"graph\"}}"
} 7.1.3 删除某个异步任务信息,不删除异步任务本身 Params force: 任务仍在运行时是否强制删除,默认为 false Method & Url DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/2Response Status 7.1.4 取消某个异步任务,该异步任务必须具有处理中断的能力 假设已经通过Gremlin API 创建了一个异步任务如下:
"for (int i = 0; i < 10; i++) {" +
"hugegraph.addVertex(T.label, 'man');" +
"hugegraph.tx().commit();" +
"try {" +
"sleep(1000);" +
"} catch (InterruptedException e) {" +
"break;" +
"}" +
"}" Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/2?action=cancel请保证在 10 秒内发送该请求,如果超过 10 秒发送,任务可能已经执行完成,无法取消。
Response Status 对已经完成或者正在取消中的任务发起取消会返回 400。
Response Body 返回整个任务对象,其中 task_status 为 cancelling 或 cancelled:
{
"task_name" : "for (int i = 0; i < 10; i++) {...}" ,
"task_progress" : 0 ,
"task_create" : 1532943976585 ,
"task_status" : "cancelling" ,
"task_update" : 1532943977001 ,
"task_retries" : 0 ,
"id" : 2 ,
"task_type" : "gremlin" ,
"task_callable" : "org.apache.hugegraph.api.job.GremlinAPI$GremlinJob"
} 此时查询 label 为 man 的顶点数目,一定是小于 10 的。
7.2 Algorithm Job 在服务内部以异步任务的方式调度一个 OLAP 算法,返回的 task id 可以用上面的 Task API 跟踪。
Params 路径参数说明:
graphspace: 图空间名称 graph: 图名称 name: 算法名称,已注册的算法有 count_vertex、count_edge、degree_centrality、stress_centrality、betweenness_centrality、closeness_centrality、eigenvector_centrality、triangle_count、cluster_coefficient、lpa、louvain、weak_connected_component、fusiform_similarity、rings、k_core、page_rank 和 subgraph_stat。名称不存在时返回 404。 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/algorithm/page_rankRequest Body 请求体是算法的参数集合,每个算法各自校验自己的参数。传 {} 表示全部使用默认值。
{
"alpha" : 0.15 ,
"times" : 10
} Response Status Response Body 7.3 Computer Job 以异步任务的方式调度一个 HugeGraph-Computer 作业。该作业在服务外部执行,参见 HugeGraph-Computer 。
Params 路径参数说明:
graphspace: 图空间名称 graph: 图名称 name: 算法名称,已注册的有 page_rank、weak_connected_component、lpa、triangle_count 和 louvain。名称不存在时返回 404。 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/computer/page_rankRequest Body 请求体是作业的参数集合,传 {} 表示全部使用默认值。
Response Status Response Body 1.15 - Gremlin API Gremlin(图查询语言)REST 接口:通过 HTTP 接口执行 Gremlin 图遍历查询语言脚本。
8.1 Gremlin ⚠️ SEC 提醒:生产环境下安全使用原生查询接口
图查询语言 (如 Gremlin/Cypher) 本身的灵活性会带来一些潜在的安全隐患。为了保障核心安全,请避免直接在公网环境暴露任何相关的原生查询接口 。
在必须对内暴露的生产场景中,必须开启 鉴权体系 (Auth) 并结合 IP 白名单 作为双重保障机制,严格控制用户执行权限。同时建议结合 Audit Log (审计日志) 来审计具体执行的语句,以及采用 容器环境 (Docker/K8s) 部署以提升系统级的安全隔离。
8.1.1 向 HugeGraphServer 发送 gremlin 语句(GET),同步执行 Params gremlin: 要发送给HugeGraphServer执行的gremlin语句 bindings: 用来绑定参数,key 是字符串,value 是绑定的值(只能是字符串或者数字),功能类似于 MySQL 的 Prepared Statement,用于加速语句执行 language: 发送语句的语言类型,默认为gremlin-groovy aliases: 为存在于图空间的已有变量添加别名 查询顶点
Method & Url GET http://127.0.0.1:8080/gremlin?gremlin=hugegraph.traversal().V('1:marko')Response Status Response Body {
"requestId" : "c6ef47a8-b634-4b07-9d38-6b3b69a3a556" ,
"status" : {
"message" : "" ,
"code" : 200 ,
"attributes" : {}
},
"result" : {
"data" : [{
"id" : "1:marko" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"city" : [{
"id" : "1:marko>city" ,
"value" : "Beijing"
}],
"name" : [{
"id" : "1:marko>name" ,
"value" : "marko"
}],
"age" : [{
"id" : "1:marko>age" ,
"value" : 29
}]
}
}],
"meta" : {}
}
} 8.1.2 向 HugeGraphServer 发送 gremlin 语句(POST),同步执行 Method & Url POST http://localhost:8080/gremlin查询顶点
Request Body {
"gremlin" : "hugegraph.traversal().V('1:marko')" ,
"bindings" : {},
"language" : "gremlin-groovy" ,
"aliases" : {}
} Response Status Response Body {
"requestId" : "c6ef47a8-b634-4b07-9d38-6b3b69a3a556" ,
"status" : {
"message" : "" ,
"code" : 200 ,
"attributes" : {}
},
"result" : {
"data" : [{
"id" : "1:marko" ,
"label" : "person" ,
"type" : "vertex" ,
"properties" : {
"city" : [{
"id" : "1:marko>city" ,
"value" : "Beijing"
}],
"name" : [{
"id" : "1:marko>name" ,
"value" : "marko"
}],
"age" : [{
"id" : "1:marko>age" ,
"value" : 29
}]
}
}],
"meta" : {}
}
} 注意:
这里是直接使用图对象(hugegraph),先获取其遍历器(traversal()),再获取顶点。
不能直接写成graph.traversal().V()或g.V(),可以通过"aliases": {"graph": "hugegraph", "g": "__g_hugegraph"}
为图和遍历器添加别名后使用别名操作。其中,hugegraph是原生存在的变量,__g_hugegraph是HugeGraphServer额外添加的变量,
每个图都会存在一个对应的这样格式(_g ${graph})的遍历器对象。
响应体的结构与其他 Vertex 或 Edge 的 RESTful API 的结构有区别,用户可能需要自行解析。
查询边
Request Body {
"gremlin" : "g.E('S1:marko>2>>S2:lop')" ,
"bindings" : {},
"language" : "gremlin-groovy" ,
"aliases" : {
"graph" : "hugegraph" ,
"g" : "__g_hugegraph"
}
} Response Status Response Body {
"requestId" : "3f117cd4-eedc-4e08-a106-ee01d7bb8249" ,
"status" : {
"message" : "" ,
"code" : 200 ,
"attributes" : {}
},
"result" : {
"data" : [{
"id" : "S1:marko>2>>S2:lop" ,
"label" : "created" ,
"type" : "edge" ,
"inVLabel" : "software" ,
"outVLabel" : "person" ,
"inV" : "2:lop" ,
"outV" : "1:marko" ,
"properties" : {
"weight" : 0.4 ,
"date" : "20171210"
}
}],
"meta" : {}
}
} 8.1.3 向 HugeGraphServer 发送 gremlin 语句(POST),异步执行 Method & Url POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/gremlin查询顶点
Request Body {
"gremlin" : "g.V('1:marko')" ,
"bindings" : {},
"language" : "gremlin-groovy" ,
"aliases" : {}
} 注意:
异步执行 Gremlin 语句暂不支持 aliases,可以使用 graph 代表要操作的图,也可以直接使用图的名字,例如 hugegraph;
另外g代表 traversal,等价于 graph.traversal() 或者 hugegraph.traversal()
Response Status Response Body 注:
可以通过GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1(其中"1"是 task_id)来查询异步任务的执行状态,更多异步任务 RESTful API
查询边
Request Body {
"gremlin" : "g.E('S1:marko>2>>S2:lop')" ,
"bindings" : {},
"language" : "gremlin-groovy" ,
"aliases" : {}
} Response Status Response Body 注:
可以通过GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/2(其中"2"是 task_id)来查询异步任务的执行状态,更多异步任务 RESTful API
1.16 - Cypher API Cypher(图查询语言)REST 接口:通过 HTTP 接口执行 OpenCypher 声明式图查询语言。
9.1 Cypher Cypher 接口必须携带 Authorization 请求头,Basic 或 Bearer 均可。即使服务未开启鉴权,不带该请求头的请求也会返回 401。凭证会通过 conf/remote-objects.yaml 转发给 Gremlin Server。
9.1.1 向 HugeGraphServer 发送 Cypher 语句(GET),同步执行 Method & Url GET / graphspaces / { graphspace } / graphs / { graph } / cypher ? cypher = { cypher } Params 路径参数说明:
graphspace: 图空间名称 graph: 图名称 请求参数说明:
使用示例 GET
http : //localhost:8080/graphspaces/DEFAULT/graphs/hugecypher1/cypher?cypher=match(n:person) return n.name as name order by n.name limit 1
Response Status Response Body {
"requestId" : "766b9f48-2f10-40d9-951a-3027d0748ab7" ,
"status" : {
"message" : "" ,
"code" : 200 ,
"attributes" : {
}
},
"result" : {
"data" : [
{
"name" : "hello"
}
],
"meta" : {
}
}
} 9.1.2 向 HugeGraphServer 发送 Cypher 语句(POST),同步执行 Method & Url POST / graphspaces / { graphspace } / graphs / { graph } / cypher Params 路径参数说明:
graphspace: 图空间名称 graph: 图名称 Body {cypher}
注意:
不是 JSON 格式,是纯文本的 Cypher 语句
使用示例 POST
http : //localhost:8080/graphspaces/DEFAULT/graphs/hugecypher1/cypher
Request Body match(n:person) return n.name as name order by n.name limit 1Response Status Response Body {
"requestId" : "f096bee0-e249-498f-b5a3-ea684fc84f57" ,
"status" : {
"message" : "" ,
"code" : 200 ,
"attributes" : {
}
},
"result" : {
"data" : [
{
"name" : "hello"
}
],
"meta" : {
}
}
} 1.17 - Authentication API Authentication(认证鉴权)REST 接口:管理用户、角色、权限和访问控制,实现细粒度的图数据安全机制。
版本变更说明 :
1.7.0+: Auth API 路径使用 GraphSpace 格式,如 /graphspaces/DEFAULT/auth/users,且 group/target 等 id 格式与 name 一致(如 admin) 1.5.x 及更早: Auth API 路径包含 graph 名称,group/target 等 id 格式类似 -69:grant。参考 HugeGraph 1.5.x RESTful API 10.1 用户认证与权限控制 开启权限及相关配置请先参考 权限配置 文档
用户认证与权限控制概述: HugeGraph 支持多用户认证、以及细粒度的权限访问控制,采用基于“用户 - 用户组 - 操作 - 资源”的 4 层设计,灵活控制用户角色与权限。
资源描述了图数据库中的数据,比如符合某一类条件的顶点,每一个资源包括 type、label、properties 三个要素,共有 18 种 type、
任意 label、任意 properties 的组合形成的资源,一个资源的内部条件是且关系,多个资源之间的条件是或关系。用户可以属于一个或多个用户组,
每个用户组可以拥有对任意个资源的操作权限,操作类型包括:读、写、删除、执行等种类。HugeGraph 支持动态创建用户、用户组、资源,
支持动态分配或取消权限。初始化数据库时超级管理员用户被创建,后续可通过超级管理员创建各类角色用户,新创建的用户如果被分配足够权限后,可以由其创建或管理更多的用户。
举例说明: user(name=boss) -belong-> group(name=all) -access(read)-> target(graph=graph1, resource={label: person,
city: Beijing}) 描述:用户’boss’拥有对’graph1’图中北京人的读权限。
接口说明: 用户认证与权限控制的核心接口包括 5 类:UserAPI、GroupAPI、TargetAPI、BelongAPI、AccessAPI。除此之外,ManagerAPI 用于授予图空间级别的管理角色,LoginAPI 用于签发和校验 token,ProjectAPI 用于把多个图归为一组从而一次性授权。
注意 : 1.5.0 及之前,group/target 等 id 的格式类似 -69:grant,1.7.0 及之后,id 和 name 一致,如 admin HugeGraph 1.5.x RESTful API
10.2 用户(User)API 用户接口包括:创建用户,删除用户,修改用户,和查询用户相关信息接口。
10.2.1 创建用户 Params user_name: 用户名称 user_password: 用户密码 user_nickname: 用户昵称 user_phone: 用户手机号 user_email: 用户邮箱 user_avatar: 用户头像地址 user_description: 用户描述 其中 user_name 和 user_password 为必填,其余为选填。
Request Body {
"user_name" : "boss" ,
"user_password" : "******" ,
"user_phone" : "182****9088" ,
"user_email" : "123@xx.com"
} Method & Url POST http://localhost:8080/graphspaces/DEFAULT/auth/usersResponse Status Response Body 返回报文中,密码为加密后的密文
{
"user_password" : "******" ,
"user_email" : "123@xx.com" ,
"user_update" : "2020-11-17 14:31:07.833" ,
"user_name" : "boss" ,
"user_creator" : "admin" ,
"user_phone" : "182****9088" ,
"id" : "boss" ,
"user_create" : "2020-11-17 14:31:07.833"
} 10.2.2 删除用户 Params Method & Url DELETE http://localhost:8080/graphspaces/DEFAULT/auth/users/testResponse Status 10.2.3 修改用户 Params Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/auth/users/testRequest Body 修改 user_password 和 user_phone。user_name 不可修改,传了也必须与已有名称一致。
{
"user_name" : "test" ,
"user_password" : "******" ,
"user_phone" : "183****9266"
} Response Status Response Body 返回结果是包含修改过的内容在内的整个用户对象
{
"user_password" : "******" ,
"user_update" : "2020-11-12 10:29:30.455" ,
"user_name" : "test" ,
"user_creator" : "admin" ,
"user_phone" : "183****9266" ,
"id" : "test" ,
"user_create" : "2020-11-12 10:27:13.601"
} 10.2.4 查询用户列表 Params name: 只返回该名称的用户,传该参数时返回的是单个用户对象而不是列表,用户不存在时返回 404 limit: 返回结果条数的上限,默认为 100 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/auth/usersResponse Status Response Body {
"users" : [
{
"user_password" : "******" ,
"user_update" : "2020-11-11 11:41:12.254" ,
"user_name" : "admin" ,
"user_creator" : "system" ,
"id" : "admin" ,
"user_create" : "2020-11-11 11:41:12.254"
}
]
} 10.2.5 查询某个用户 Params Method & Url GET http://localhost:8080/graphspaces/DEFAULT/auth/users/adminResponse Status Response Body {
"user_password" : "******" ,
"user_update" : "2020-11-11 11:41:12.254" ,
"user_name" : "admin" ,
"user_creator" : "system" ,
"id" : "admin" ,
"user_create" : "2020-11-11 11:41:12.254"
} 10.2.6 查询某个用户的角色 Method & Url GET http://localhost:8080/graphspaces/DEFAULT/auth/users/boss/roleResponse Status Response Body {
"roles" : {
"hugegraph" : {
"READ" : [
{
"type" : "ALL" ,
"label" : "*" ,
"properties" : null
}
]
}
}
} 10.3 用户组(Group)API 用户组会赋予相应的资源权限,用户会被分配不同的用户组,即可拥有不同的资源权限。 用户组接口包括:创建用户组,删除用户组,修改用户组,和查询用户组相关信息接口。
10.3.1 创建用户组 Params group_name: 用户组名称 group_description: 用户组描述 Request Body {
"group_name" : "all" ,
"group_description" : "group can do anything"
} Method & Url POST http://localhost:8080/graphspaces/DEFAULT/auth/groupsResponse Status Response Body {
"group_creator" : "admin" ,
"group_name" : "all" ,
"group_create" : "2020-11-11 15:46:08.791" ,
"group_update" : "2020-11-11 15:46:08.791" ,
"id" : "-69:all" ,
"group_description" : "group can do anything"
} 10.3.2 删除用户组 Params Method & Url DELETE http://localhost:8080/graphspaces/DEFAULT/auth/groups/-69:grantResponse Status 10.3.3 修改用户组 Params Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/auth/groups/-69:grantRequest Body 修改 group_description
{
"group_name" : "grant" ,
"group_description" : "grant"
} Response Status Response Body 返回结果是包含修改过的内容在内的整个用户组对象
{
"group_creator" : "admin" ,
"group_name" : "grant" ,
"group_create" : "2020-11-12 09:50:58.458" ,
"group_update" : "2020-11-12 09:57:58.155" ,
"id" : "-69:grant" ,
"group_description" : "grant"
} 10.3.4 查询用户组列表 Params Method & Url GET http://localhost:8080/graphspaces/DEFAULT/auth/groupsResponse Status Response Body {
"groups" : [
{
"group_creator" : "admin" ,
"group_name" : "all" ,
"group_create" : "2020-11-11 15:46:08.791" ,
"group_update" : "2020-11-11 15:46:08.791" ,
"id" : "-69:all" ,
"group_description" : "group can do anything"
}
]
} 10.3.5 查询某个用户组 Params Method & Url GET http://localhost:8080/graphspaces/DEFAULT/auth/groups/-69:allResponse Status Response Body {
"group_creator" : "admin" ,
"group_name" : "all" ,
"group_create" : "2020-11-11 15:46:08.791" ,
"group_update" : "2020-11-11 15:46:08.791" ,
"id" : "-69:all" ,
"group_description" : "group can do anything"
} 10.4 资源(Target)API 资源描述了图数据库中的数据,比如符合某一类条件的顶点,每一个资源包括 type、label、properties 三个要素,共有 18 种 type、
任意 label、任意 properties 的组合形成的资源,一个资源的内部条件是且关系,多个资源之间的条件是或关系。 资源接口包括:资源的创建、删除、修改和查询。
10.4.1 创建资源 Params target_name: 资源名称 target_graph: 资源图 target_url: 资源地址 target_resources: 资源定义 (列表) target_resources 可以包括多个 target_resource,以列表的形式存储。 每个 target_resource 包含:
type:可选值 VERTEX, EDGE 等,可填 ALL,则表示可以是顶点或边; label:可选值,⼀个顶点或边类型的名称,可填*,则表示任意类型; properties:map 类型,可包含多个属性的键值对,必须匹配所有属性值,属性值⽀持填条件范围(age:
P.gte(18)),properties 如果为 null 表示任意属性均可,如果属性名和属性值均为‘*ʼ也表示任意属性均可。 如精细资源:“target_resources”: [{“type”:“VERTEX”,“label”:“person”,“properties”:{“city”:“Beijing”,“age”:“P.gte(20)”}}]** 资源定义含义:类型是’person’的顶点,且城市属性是’Beijing’,年龄属性大于等于 20。
Request Body {
"target_name" : "all" ,
"target_graph" : "hugegraph" ,
"target_url" : "127.0.0.1:8080" ,
"target_resources" : [
{
"type" : "ALL"
}
]
} Method & Url POST http://localhost:8080/graphspaces/DEFAULT/auth/targetsResponse Status Response Body {
"target_creator" : "admin" ,
"target_name" : "all" ,
"target_url" : "127.0.0.1:8080" ,
"target_graph" : "hugegraph" ,
"target_create" : "2020-11-11 15:32:01.192" ,
"target_resources" : [
{
"type" : "ALL" ,
"label" : "*" ,
"properties" : null
}
],
"id" : "-77:all" ,
"target_update" : "2020-11-11 15:32:01.192"
} 10.4.2 删除资源 Params Method & Url DELETE http://localhost:8080/graphspaces/DEFAULT/auth/targets/-77:gremlinResponse Status 10.4.3 修改资源 Params Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/auth/targets/-77:gremlinRequest Body 修改资源定义中的 type
{
"target_name" : "gremlin" ,
"target_graph" : "hugegraph" ,
"target_url" : "127.0.0.1:8080" ,
"target_resources" : [
{
"type" : "NONE"
}
]
} Response Status Response Body 返回结果是包含修改过的内容在内的整个用户组对象
{
"target_creator" : "admin" ,
"target_name" : "gremlin" ,
"target_url" : "127.0.0.1:8080" ,
"target_graph" : "hugegraph" ,
"target_create" : "2020-11-12 09:34:13.848" ,
"target_resources" : [
{
"type" : "NONE" ,
"label" : "*" ,
"properties" : null
}
],
"id" : "-77:gremlin" ,
"target_update" : "2020-11-12 09:37:12.780"
} 10.4.4 查询资源列表 Params Method & Url GET http://localhost:8080/graphspaces/DEFAULT/auth/targetsResponse Status Response Body {
"targets" : [
{
"target_creator" : "admin" ,
"target_name" : "all" ,
"target_url" : "127.0.0.1:8080" ,
"target_graph" : "hugegraph" ,
"target_create" : "2020-11-11 15:32:01.192" ,
"target_resources" : [
{
"type" : "ALL" ,
"label" : "*" ,
"properties" : null
}
],
"id" : "-77:all" ,
"target_update" : "2020-11-11 15:32:01.192"
},
{
"target_creator" : "admin" ,
"target_name" : "grant" ,
"target_url" : "127.0.0.1:8080" ,
"target_graph" : "hugegraph" ,
"target_create" : "2020-11-11 15:43:24.841" ,
"target_resources" : [
{
"type" : "GRANT" ,
"label" : "*" ,
"properties" : null
}
],
"id" : "-77:grant" ,
"target_update" : "2020-11-11 15:43:24.841"
}
]
} 10.4.5 查询某个资源 Params Method & Url GET http://localhost:8080/graphspaces/DEFAULT/auth/targets/-77:grantResponse Status Response Body {
"target_creator" : "admin" ,
"target_name" : "grant" ,
"target_url" : "127.0.0.1:8080" ,
"target_graph" : "hugegraph" ,
"target_create" : "2020-11-11 15:43:24.841" ,
"target_resources" : [
{
"type" : "GRANT" ,
"label" : "*" ,
"properties" : null
}
],
"id" : "-77:grant" ,
"target_update" : "2020-11-11 15:43:24.841"
} 10.5 关联角色(Belong)API 关联用户和用户组的关系,一个用户可以关联一个或者多个用户组。用户组拥有相关资源的权限,不同用户组的资源权限可以理解为不同的角色。即给用户关联角色。 关联角色接口包括:用户关联角色的创建、删除、修改和查询。
10.5.1 创建用户的关联角色 Params user: 用户 Id group: 用户组 Id belong_description: 描述 Request Body {
"user" : "boss" ,
"group" : "-69:all"
} Method & Url POST http://localhost:8080/graphspaces/DEFAULT/auth/belongsResponse Status Response Body {
"belong_create" : "2020-11-11 16:19:35.422" ,
"belong_creator" : "admin" ,
"belong_update" : "2020-11-11 16:19:35.422" ,
"id" : "Sboss>-82>>S-69:all" ,
"user" : "boss" ,
"group" : "-69:all"
} 10.5.2 删除关联角色 Params Method & Url DELETE http://localhost:8080/graphspaces/DEFAULT/auth/belongs/Sboss>-82>>S-69:grantResponse Status 10.5.3 修改关联角色 关联角色只能修改描述,不能修改 user 和 group 属性,如果需要修改关联角色,需要删除原来关联关系,新增关联角色。
Params Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/auth/belongs/Sboss>-82>>S-69:grantRequest Body 修改 belong_description
{
"belong_description" : "update test"
} Response Status Response Body 返回结果是包含修改过的内容在内的整个用户组对象
{
"belong_description" : "update test" ,
"belong_create" : "2020-11-12 10:40:21.720" ,
"belong_creator" : "admin" ,
"belong_update" : "2020-11-12 10:42:47.265" ,
"id" : "Sboss>-82>>S-69:grant" ,
"user" : "boss" ,
"group" : "-69:grant"
} 10.5.4 查询关联角色列表 Params user: 只返回该用户的关联关系 group: 只返回该角色的关联关系 limit: 返回结果条数的上限,默认为 100 user 和 group 不能同时使用。
Method & Url GET http://localhost:8080/graphspaces/DEFAULT/auth/belongsResponse Status Response Body {
"belongs" : [
{
"belong_create" : "2020-11-11 16:19:35.422" ,
"belong_creator" : "admin" ,
"belong_update" : "2020-11-11 16:19:35.422" ,
"id" : "Sboss>-82>>S-69:all" ,
"user" : "boss" ,
"group" : "-69:all"
}
]
} 10.5.5 查看某个关联角色 Params Method & Url GET http://localhost:8080/graphspaces/DEFAULT/auth/belongs/Sboss>-82>>S-69:allResponse Status Response Body {
"belong_create" : "2020-11-11 16:19:35.422" ,
"belong_creator" : "admin" ,
"belong_update" : "2020-11-11 16:19:35.422" ,
"id" : "Sboss>-82>>S-69:all" ,
"user" : "boss" ,
"group" : "-69:all"
} 10.6 赋权(Access)API 给用户组赋予资源的权限,主要包含:读操作 (READ)、写操作 (WRITE)、删除操作 (DELETE)、执行操作 (EXECUTE) 等。 赋权接口包括:赋权的创建、删除、修改和查询。
10.6.1 创建赋权 (用户组赋予资源的权限) Params group: 用户组 Id target: 资源 Id access_permission: 权限许可 access_description: 赋权描述 access_permission:
READ:读操作,所有的查询,包括查询 Schema、查顶点/边,查询顶点和边的数量 VERTEX_AGGR/EDGE_AGGR,也包括读图的状态 STATUS、变量 VAR、任务 TASK 等; WRITE:写操作,所有的创建、更新操作,包括给 Schema 增加 property key,给顶点增加或更新属性等; DELETE:删除操作,包括删除元数据、删除顶点/边; EXECUTE:执⾏操作,包括执⾏ Gremlin 语句、执⾏ Task、执⾏ metadata 函数; Request Body {
"group" : "-69:all" ,
"target" : "-77:all" ,
"access_permission" : "READ"
} Method & Url POST http://localhost:8080/graphspaces/DEFAULT/auth/accessesResponse Status Response Body {
"access_permission" : "READ" ,
"access_create" : "2020-11-11 15:54:54.008" ,
"id" : "S-69:all>-88>11>S-77:all" ,
"access_update" : "2020-11-11 15:54:54.008" ,
"access_creator" : "admin" ,
"group" : "-69:all" ,
"target" : "-77:all"
} 10.6.2 删除赋权 Params Method & Url DELETE http://localhost:8080/graphspaces/DEFAULT/auth/accesses/S-69:all>-88>12>S-77:allResponse Status 10.6.3 修改赋权 赋权只能修改描述,不能修改用户组、资源和权限许可,如果需要修改赋权的关系,可以删除原来的赋权关系,新增赋权。
Params Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/auth/accesses/S-69:all>-88>12>S-77:allRequest Body 修改 access_description
{
"access_description" : "test"
} Response Status Response Body 返回结果是包含修改过的内容在内的整个用户组对象
{
"access_description" : "test" ,
"access_permission" : "WRITE" ,
"access_create" : "2020-11-12 10:12:03.074" ,
"id" : "S-69:all>-88>12>S-77:all" ,
"access_update" : "2020-11-12 10:16:18.637" ,
"access_creator" : "admin" ,
"group" : "-69:all" ,
"target" : "-77:all"
} 10.6.4 查询赋权列表 Params group: 只返回该角色的赋权记录 target: 只返回该资源上的赋权记录 limit: 返回结果条数的上限,默认为 100 group 和 target 不能同时使用。
Method & Url GET http://localhost:8080/graphspaces/DEFAULT/auth/accessesResponse Status Response Body {
"accesses" : [
{
"access_permission" : "READ" ,
"access_create" : "2020-11-11 15:54:54.008" ,
"id" : "S-69:all>-88>11>S-77:all" ,
"access_update" : "2020-11-11 15:54:54.008" ,
"access_creator" : "admin" ,
"group" : "-69:all" ,
"target" : "-77:all"
}
]
} 10.6.5 查询某个赋权 Params Method & Url GET http://localhost:8080/graphspaces/DEFAULT/auth/accesses/S-69:all>-88>11>S-77:allResponse Status Response Body {
"access_permission" : "READ" ,
"access_create" : "2020-11-11 15:54:54.008" ,
"id" : "S-69:all>-88>11>S-77:all" ,
"access_update" : "2020-11-11 15:54:54.008" ,
"access_creator" : "admin" ,
"group" : "-69:all" ,
"target" : "-77:all"
} 10.7 图空间管理员(Manager)API 重要提示 :在使用以下 API 之前,需要先创建图空间(graphspace)。请参考 Graphspace API 创建名为 gs1 的图空间。文档中的示例均假设已存在名为 gs1 的图空间
重要提示 :管理员相关接口只在 PD 模式下可用,单机模式下会返回 400 和 GraphSpace management is not supported in standalone mode 错误信息。
图空间管理员 API 用于在 graphspace 维度给用户授予/回收管理员角色,并查询当前用户或其他用户在该 graphspace 下的角色信息。角色类型可取 SPACE、SPACE_MEMBER、ADMIN 。 10.7.1 检查当前登录用户是否拥有某个角色 Params type: 需要校验的角色类型,必填,取值为 SPACE、SPACE_MEMBER、ADMIN 之一 Method & Url GET http://localhost:8080/graphspaces/gs1/auth/managers/check?type=SPACE_MEMBERResponse Status Response Body 10.7.2 查询图空间管理员列表 Params type: 角色类型,必填,取值为 SPACE、SPACE_MEMBER、ADMIN 之一。SPACE 返回图空间管理员,SPACE_MEMBER 返回图空间成员,ADMIN 返回整个集群的管理员 Method & Url GET http://localhost:8080/graphspaces/gs1/auth/managers?type=SPACEResponse Status Response Body {
"admins" : [
"admin"
]
} 10.7.3 授权/创建图空间管理员 下面在 gs1 下,将用户 boss 授权为 SPACE_MEMBER 角色 Params user: 用户或角色名称,必填 type: 角色类型,必填,取值为 SPACE、SPACE_MEMBER、ADMIN 之一 把已经是图空间成员的用户授权为 SPACE 时会先回收其成员角色,反之同理。只有管理员可以授予 ADMIN。
Request Body {
"user" : "boss" ,
"type" : "SPACE_MEMBER"
} Method & Url POST http://localhost:8080/graphspaces/gs1/auth/managersResponse Status Response Body {
"user" : "boss" ,
"type" : "SPACE_MEMBER" ,
"graphspace" : "gs1"
} 10.7.4 取消图空间管理员权限 下面在 gs1 下,将用户 boss 的 SPACE_MEMBER 角色删除 Params user: 需要删除的用户名称,内置的 admin 用户不能从 ADMIN 中移除 type: 需要删除的角色类型,取值为 SPACE、SPACE_MEMBER、ADMIN 之一 Method & Url DELETE http://localhost:8080/graphspaces/gs1/auth/managers?user=boss&type=SPACE_MEMBERResponse Status 10.7.5 查询指定用户在图空间中的角色 Params Method & Url GET http://localhost:8080/graphspaces/gs1/auth/managers/role?user=bossResponse Status Response Body 返回的角色取自 ADMIN、SPACE、SPACE_MEMBER;用户在该图空间下不具备其中任何角色时返回 NONE。
{
"user" : "boss" ,
"graphspace" : "gs1" ,
"roles" : [
"SPACE_MEMBER"
]
} 10.7.6 检查当前登录用户是否拥有某个默认角色 默认角色是图空间的内置角色,参见 Graphspace API 。role 的合法取值为 space、space_member、analyst 和 observer;graph 只在 role=observer 时生效。
Params role: 默认角色名称,必填 graph: 图名称,选填,只在 role=observer 时使用 Method & Url GET http://localhost:8080/graphspaces/gs1/auth/managers/default?role=analystResponse Status Response Body 10.8 登录(Login)API 除了 HTTP Basic 认证之外,服务还可以签发 JWT token,之后通过 Authorization: Bearer <token> 请求头携带。登录相关接口不带图空间前缀。
token 使用 auth.token_secret 配置项签名,有效期为 auth.token_expire 秒(默认 86400)。该密钥的默认值在启动时随机生成,因此当 token 需要在重启后继续有效、或者需要被多个服务节点接受时,必须显式配置该项。
10.8.1 登录并获取 token Params user_name: 用户名称,必填 user_password: 用户密码,必填 token_expire: token 有效期(秒),选填 Request Body {
"user_name" : "test" ,
"user_password" : "******"
} Method & Url POST http://localhost:8080/auth/loginResponse Status 用户名或密码错误时返回 401。
Response Body {
"token" : "eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX25hbWUiOiJ0ZXN0IiwidXNlcl9pZCI6InRlc3QiLCJleHAiOjE3MTIxMjM0NTZ9.PBs0iBt0PtqvLDpJvKrPHkyIzT1TICz9zJmMy8FvXVo"
} 10.8.2 登出并使 token 失效 需要失效的 token 从请求头中获取,无需请求体。
Params 请求头说明:
Authorization: Bearer <token>,必填。只接受 Bearer 方式,其他方式返回 400。 Method & Url DELETE http://localhost:8080/auth/logoutResponse Status token 非法或已过期时返回 401。
10.8.3 校验 token Params 请求头说明:
Authorization: Bearer <token>,必填 Method & Url GET http://localhost:8080/auth/verifyResponse Status token 非法或已过期时返回 401。
Response Body {
"user_name" : "test" ,
"user_id" : "test"
} 10.9 项目(Project)API 项目把一组图和一个管理员角色、一个操作员角色绑定在一起,从而可以一次性对这组图授权。创建项目时会同时生成它的 project_target、project_admin_group 和 project_op_group,这些字段会在响应中返回,但不能由客户端设置。
10.9.1 创建项目 Params project_name: 项目名称,必填 project_description: 项目描述,选填 创建时不能传 project_graphs,请使用下面的 add_graph 操作。
Request Body {
"project_name" : "test_project" ,
"project_description" : "this is a good project"
} Method & Url POST http://localhost:8080/graphspaces/DEFAULT/auth/projectsResponse Status Response Body {
"project_name" : "test_project" ,
"project_description" : "this is a good project" ,
"project_target" : "project_test_project" ,
"project_admin_group" : "project_test_project_admin" ,
"project_op_group" : "project_test_project_op" ,
"project_create" : "2024-01-10 09:30:00.000" ,
"project_update" : "2024-01-10 09:30:00.000" ,
"project_creator" : "admin" ,
"id" : "test_project"
} 10.9.2 向项目中添加或移除图 Params id: 项目 Id action: add_graph 表示添加,remove_graph 表示移除 Request Body {
"project_graphs" : [
"hugegraph"
]
} Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/auth/projects/test_project?action=add_graphResponse Status Response Body 返回整个项目对象,其中包含更新后的图列表。
10.9.3 修改项目描述 Params 不传 action 时表示修改描述,此时请求体中不能带 project_graphs。
Request Body {
"project_description" : "update desc"
} Method & Url PUT http://localhost:8080/graphspaces/DEFAULT/auth/projects/test_projectResponse Status 10.9.4 查询项目列表 Params Method & Url GET http://localhost:8080/graphspaces/DEFAULT/auth/projectsResponse Status Response Body {
"projects" : [
{
"project_name" : "test_project" ,
"project_description" : "this is a good project" ,
"project_target" : "project_test_project" ,
"project_admin_group" : "project_test_project_admin" ,
"project_op_group" : "project_test_project_op" ,
"project_create" : "2024-01-10 09:30:00.000" ,
"project_update" : "2024-01-10 09:30:00.000" ,
"project_creator" : "admin" ,
"id" : "test_project"
}
]
} 10.9.5 查询某个项目 Params Method & Url GET http://localhost:8080/graphspaces/DEFAULT/auth/projects/test_projectResponse Status 10.9.6 删除项目 Params 删除前需要先把项目中的图全部移除。
Method & Url DELETE http://localhost:8080/graphspaces/DEFAULT/auth/projects/test_projectResponse Status 1.18 - Metrics API Metrics(监控指标)REST 接口:获取系统运行时的性能指标、统计信息和健康状态数据。
HugeGraph 提供了获取监控信息的 Metrics 接口,比如各个 Gremlin 执行时间的统计、缓存的占用大小等。Metrics
接口包括如下几类:基础指标、统计指标、系统指标、后端存储指标。
1. 基础指标 1.1 获取所有基础指标 Params type:如果传值为json,则以 json 格式返回,否则以 Promethaus 格式返回。 1.1.1 Method & Url http://localhost:8080/metrics/?type=jsonResponse Status Response Body {
"gauges" : {
"org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.capacity" : {
"value" : 1000000
},
"org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.expire" : {
"value" : 600000
},
"org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.hits" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.miss" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.size" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.instances" : {
"value" : 7
},
"org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.capacity" : {
"value" : 10000
},
"org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.expire" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.hits" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.miss" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.size" : {
"value" : 17
},
"org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.capacity" : {
"value" : 10000
},
"org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.expire" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.hits" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.miss" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.size" : {
"value" : 17
},
"org.apache.hugegraph.backend.cache.Cache.token-hugegraph.capacity" : {
"value" : 10240
},
"org.apache.hugegraph.backend.cache.Cache.token-hugegraph.expire" : {
"value" : 600000
},
"org.apache.hugegraph.backend.cache.Cache.token-hugegraph.hits" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.token-hugegraph.miss" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.token-hugegraph.size" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.users-hugegraph.capacity" : {
"value" : 10240
},
"org.apache.hugegraph.backend.cache.Cache.users-hugegraph.expire" : {
"value" : 600000
},
"org.apache.hugegraph.backend.cache.Cache.users-hugegraph.hits" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.users-hugegraph.miss" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.users-hugegraph.size" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.capacity" : {
"value" : 10240
},
"org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.expire" : {
"value" : 600000
},
"org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.hits" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.miss" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.size" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.capacity" : {
"value" : 10000000
},
"org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.expire" : {
"value" : 600000
},
"org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.hits" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.miss" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.size" : {
"value" : 0
},
"org.apache.hugegraph.server.RestServer.max-write-threads" : {
"value" : 0
},
"org.apache.hugegraph.task.TaskManager.pending-tasks" : {
"value" : 0
},
"org.apache.hugegraph.task.TaskManager.workers" : {
"value" : 4
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.average-load-penalty" : {
"value" : 922769200
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.estimated-size" : {
"value" : 2
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-count" : {
"value" : 0
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-weight" : {
"value" : 0
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-count" : {
"value" : 0
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-rate" : {
"value" : 0
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-count" : {
"value" : 2
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-count" : {
"value" : 0
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-rate" : {
"value" : 0
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-success-count" : {
"value" : 2
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.long-run-compilation-count" : {
"value" : 0
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-count" : {
"value" : 2
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-rate" : {
"value" : 1
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.request-count" : {
"value" : 2
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.total-load-time" : {
"value" : 1845538400
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.sessions" : {
"value" : 0
}
},
"counters" : {
"favicon.ico/GET/FAILED_COUNTER" : {
"count" : 1
},
"favicon.ico/GET/TOTAL_COUNTER" : {
"count" : 1
},
"metrics/POST/FAILED_COUNTER" : {
"count" : 1
},
"metrics/POST/TOTAL_COUNTER" : {
"count" : 1
},
"metrics/backend/GET/SUCCESS_COUNTER" : {
"count" : 2
},
"metrics/backend/GET/TOTAL_COUNTER" : {
"count" : 2
},
"metrics/gauges/GET/SUCCESS_COUNTER" : {
"count" : 1
},
"metrics/gauges/GET/TOTAL_COUNTER" : {
"count" : 1
},
"metrics/system/GET/SUCCESS_COUNTER" : {
"count" : 2
},
"metrics/system/GET/TOTAL_COUNTER" : {
"count" : 2
},
"system/GET/FAILED_COUNTER" : {
"count" : 1
},
"system/GET/TOTAL_COUNTER" : {
"count" : 1
}
},
"histograms" : {
"favicon.ico/GET/RESPONSE_TIME_HISTOGRAM" : {
"count" : 1 ,
"min" : 1 ,
"mean" : 1 ,
"max" : 1 ,
"stddev" : 0 ,
"p50" : 1 ,
"p75" : 1 ,
"p95" : 1 ,
"p98" : 1 ,
"p99" : 1 ,
"p999" : 1
},
"metrics/POST/RESPONSE_TIME_HISTOGRAM" : {
"count" : 1 ,
"min" : 21 ,
"mean" : 21 ,
"max" : 21 ,
"stddev" : 0 ,
"p50" : 21 ,
"p75" : 21 ,
"p95" : 21 ,
"p98" : 21 ,
"p99" : 21 ,
"p999" : 21
},
"metrics/backend/GET/RESPONSE_TIME_HISTOGRAM" : {
"count" : 2 ,
"min" : 6 ,
"mean" : 12.6852124529148 ,
"max" : 20 ,
"stddev" : 6.992918475157571 ,
"p50" : 6 ,
"p75" : 20 ,
"p95" : 20 ,
"p98" : 20 ,
"p99" : 20 ,
"p999" : 20
},
"metrics/gauges/GET/RESPONSE_TIME_HISTOGRAM" : {
"count" : 1 ,
"min" : 7 ,
"mean" : 7 ,
"max" : 7 ,
"stddev" : 0 ,
"p50" : 7 ,
"p75" : 7 ,
"p95" : 7 ,
"p98" : 7 ,
"p99" : 7 ,
"p999" : 7
},
"metrics/system/GET/RESPONSE_TIME_HISTOGRAM" : {
"count" : 2 ,
"min" : 0 ,
"mean" : 8.942674506664073 ,
"max" : 40 ,
"stddev" : 16.665399873223066 ,
"p50" : 0 ,
"p75" : 0 ,
"p95" : 40 ,
"p98" : 40 ,
"p99" : 40 ,
"p999" : 40
},
"system/GET/RESPONSE_TIME_HISTOGRAM" : {
"count" : 1 ,
"min" : 2 ,
"mean" : 2 ,
"max" : 2 ,
"stddev" : 0 ,
"p50" : 2 ,
"p75" : 2 ,
"p95" : 2 ,
"p98" : 2 ,
"p99" : 2 ,
"p999" : 2
}
},
"meters" : {
"org.apache.hugegraph.api.API.commit-succeed" : {
"count" : 0 ,
"mean_rate" : 0 ,
"m15_rate" : 0 ,
"m5_rate" : 0 ,
"m1_rate" : 0 ,
"rate_unit" : "events/second"
},
"org.apache.hugegraph.api.API.expected-error" : {
"count" : 0 ,
"mean_rate" : 0 ,
"m15_rate" : 0 ,
"m5_rate" : 0 ,
"m1_rate" : 0 ,
"rate_unit" : "events/second"
},
"org.apache.hugegraph.api.API.illegal-arg" : {
"count" : 0 ,
"mean_rate" : 0 ,
"m15_rate" : 0 ,
"m5_rate" : 0 ,
"m1_rate" : 0 ,
"rate_unit" : "events/second"
},
"org.apache.hugegraph.api.API.unknown-error" : {
"count" : 0 ,
"mean_rate" : 0 ,
"m15_rate" : 0 ,
"m5_rate" : 0 ,
"m1_rate" : 0 ,
"rate_unit" : "events/second"
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.errors" : {
"count" : 0 ,
"mean_rate" : 0 ,
"m15_rate" : 0 ,
"m5_rate" : 0 ,
"m1_rate" : 0 ,
"rate_unit" : "events/second"
}
},
"timers" : {
"org.apache.hugegraph.api.auth.AccessAPI.create" : {
"count" : 0 ,
"min" : 0 ,
"mean" : 0 ,
"max" : 0 ,
"stddev" : 0 ,
"p50" : 0 ,
"p75" : 0 ,
"p95" : 0 ,
"p98" : 0 ,
"p99" : 0 ,
"p999" : 0 ,
"duration_unit" : "milliseconds" ,
"mean_rate" : 0 ,
"m15_rate" : 0 ,
"m5_rate" : 0 ,
"m1_rate" : 0 ,
"rate_unit" : "calls/second"
},
"org.apache.hugegraph.api.auth.AccessAPI.delete" : {
"count" : 0 ,
"min" : 0 ,
"mean" : 0 ,
"max" : 0 ,
"stddev" : 0 ,
"p50" : 0 ,
"p75" : 0 ,
"p95" : 0 ,
"p98" : 0 ,
"p99" : 0 ,
"p999" : 0 ,
"duration_unit" : "milliseconds" ,
"mean_rate" : 0 ,
"m15_rate" : 0 ,
"m5_rate" : 0 ,
"m1_rate" : 0 ,
"rate_unit" : "calls/second"
},
"org.apache.hugegraph.api.auth.AccessAPI.get" : {
"count" : 0 ,
"min" : 0 ,
"mean" : 0 ,
"max" : 0 ,
"stddev" : 0 ,
"p50" : 0 ,
"p75" : 0 ,
"p95" : 0 ,
"p98" : 0 ,
"p99" : 0 ,
"p999" : 0 ,
"duration_unit" : "milliseconds" ,
"mean_rate" : 0 ,
"m15_rate" : 0 ,
"m5_rate" : 0 ,
"m1_rate" : 0 ,
"rate_unit" : "calls/second"
},
"org.apache.hugegraph.api.auth.AccessAPI.list" : {
"count" : 0 ,
"min" : 0 ,
"mean" : 0 ,
"max" : 0 ,
"stddev" : 0 ,
"p50" : 0 ,
"p75" : 0 ,
"p95" : 0 ,
"p98" : 0 ,
"p99" : 0 ,
"p999" : 0 ,
"duration_unit" : "milliseconds" ,
"mean_rate" : 0 ,
"m15_rate" : 0 ,
"m5_rate" : 0 ,
"m1_rate" : 0 ,
"rate_unit" : "calls/second"
},
...
}
} 1.1.2 Method & Url http://localhost:8080/metrics/Response Status Response Body # HELP hugegraph_info
# TYPE hugegraph_info untyped
hugegraph_info{version="0.69",
} 1.0
# HELP org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_capacity
# TYPE org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_capacity gauge
org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_capacity 1000000
# HELP org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_expire
# TYPE org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_expire gauge
org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_expire 600000
# HELP org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_hits
# TYPE org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_hits gauge
org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_hits 0
# HELP org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_miss
# TYPE org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_miss gauge
org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_miss 0
# HELP org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_size
# TYPE org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_size gauge
org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_size 0
# HELP org_apache_hugegraph_backend_cache_Cache_instances
# TYPE org_apache_hugegraph_backend_cache_Cache_instances gauge
org_apache_hugegraph_backend_cache_Cache_instances 7
# HELP org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_capacity
# TYPE org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_capacity gauge
org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_capacity 10000
# HELP org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_expire
# TYPE org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_expire gauge
org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_expire 0
# HELP org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_hits
# TYPE org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_hits gauge
org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_hits 0
# HELP org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_miss
# TYPE org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_miss gauge
org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_miss 0
# HELP org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_size
# TYPE org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_size gauge
org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_size 17
# HELP org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_capacity
# TYPE org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_capacity gauge
org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_capacity 10000
# HELP org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_expire
# TYPE org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_expire gauge
org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_expire 0
# HELP org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_hits
# TYPE org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_hits gauge
org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_hits 0
# HELP org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_miss
# TYPE org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_miss gauge
org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_miss 0
# HELP org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_size
# TYPE org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_size gauge
org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_size 17
... 1.2 获取 Gauges 指标 Method & Url http://localhost:8080/metrics/gaugesResponse Status Response Body {
"org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.capacity" : {
"value" : 1000000
},
"org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.expire" : {
"value" : 600000
},
"org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.hits" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.miss" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.size" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.instances" : {
"value" : 7
},
"org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.capacity" : {
"value" : 10000
},
"org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.expire" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.hits" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.miss" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.size" : {
"value" : 17
},
"org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.capacity" : {
"value" : 10000
},
"org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.expire" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.hits" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.miss" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.size" : {
"value" : 17
},
"org.apache.hugegraph.backend.cache.Cache.token-hugegraph.capacity" : {
"value" : 10240
},
"org.apache.hugegraph.backend.cache.Cache.token-hugegraph.expire" : {
"value" : 600000
},
"org.apache.hugegraph.backend.cache.Cache.token-hugegraph.hits" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.token-hugegraph.miss" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.token-hugegraph.size" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.users-hugegraph.capacity" : {
"value" : 10240
},
"org.apache.hugegraph.backend.cache.Cache.users-hugegraph.expire" : {
"value" : 600000
},
"org.apache.hugegraph.backend.cache.Cache.users-hugegraph.hits" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.users-hugegraph.miss" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.users-hugegraph.size" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.capacity" : {
"value" : 10240
},
"org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.expire" : {
"value" : 600000
},
"org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.hits" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.miss" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.size" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.capacity" : {
"value" : 10000000
},
"org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.expire" : {
"value" : 600000
},
"org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.hits" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.miss" : {
"value" : 0
},
"org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.size" : {
"value" : 0
},
"org.apache.hugegraph.server.RestServer.max-write-threads" : {
"value" : 0
},
"org.apache.hugegraph.task.TaskManager.pending-tasks" : {
"value" : 0
},
"org.apache.hugegraph.task.TaskManager.workers" : {
"value" : 4
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.average-load-penalty" : {
"value" : 9.227692E8
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.estimated-size" : {
"value" : 2
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-count" : {
"value" : 0
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-weight" : {
"value" : 0
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-count" : {
"value" : 0
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-rate" : {
"value" : 0.0
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-count" : {
"value" : 2
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-count" : {
"value" : 0
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-rate" : {
"value" : 0.0
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-success-count" : {
"value" : 2
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.long-run-compilation-count" : {
"value" : 0
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-count" : {
"value" : 2
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-rate" : {
"value" : 1.0
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.request-count" : {
"value" : 2
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.total-load-time" : {
"value" : 1845538400
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.sessions" : {
"value" : 0
}
} 1.3 获取 Counters 指标 Method & Url GET http://localhost:8080/metrics/countersResponse Status Response Body {
"favicon.ico/GET/FAILED_COUNTER" : {
"count" : 1
},
"favicon.ico/GET/TOTAL_COUNTER" : {
"count" : 1
},
"metrics//GET/SUCCESS_COUNTER" : {
"count" : 2
},
"metrics//GET/TOTAL_COUNTER" : {
"count" : 2
},
"metrics/POST/FAILED_COUNTER" : {
"count" : 1
},
"metrics/POST/TOTAL_COUNTER" : {
"count" : 1
},
"metrics/backend/GET/SUCCESS_COUNTER" : {
"count" : 2
},
"metrics/backend/GET/TOTAL_COUNTER" : {
"count" : 2
},
"metrics/gauges/GET/SUCCESS_COUNTER" : {
"count" : 1
},
"metrics/gauges/GET/TOTAL_COUNTER" : {
"count" : 1
},
"metrics/statistics/GET/SUCCESS_COUNTER" : {
"count" : 2
},
"metrics/statistics/GET/TOTAL_COUNTER" : {
"count" : 2
},
"metrics/system/GET/SUCCESS_COUNTER" : {
"count" : 2
},
"metrics/system/GET/TOTAL_COUNTER" : {
"count" : 2
},
"metrics/timers/GET/SUCCESS_COUNTER" : {
"count" : 1
},
"metrics/timers/GET/TOTAL_COUNTER" : {
"count" : 1
},
"system/GET/FAILED_COUNTER" : {
"count" : 1
},
"system/GET/TOTAL_COUNTER" : {
"count" : 1
}
} 1.4 获取 histograms 指标 Method & Url GET http://localhost:8080/metrics/gaugesResponse Status Response Body {
"favicon.ico/GET/RESPONSE_TIME_HISTOGRAM" : {
"count" : 1 ,
"min" : 1 ,
"mean" : 1.0 ,
"max" : 1 ,
"stddev" : 0.0 ,
"p50" : 1.0 ,
"p75" : 1.0 ,
"p95" : 1.0 ,
"p98" : 1.0 ,
"p99" : 1.0 ,
"p999" : 1.0
},
"metrics//GET/RESPONSE_TIME_HISTOGRAM" : {
"count" : 2 ,
"min" : 10 ,
"mean" : 10.0 ,
"max" : 10 ,
"stddev" : 0.0 ,
"p50" : 10.0 ,
"p75" : 10.0 ,
"p95" : 10.0 ,
"p98" : 10.0 ,
"p99" : 10.0 ,
"p999" : 10.0
},
"metrics/POST/RESPONSE_TIME_HISTOGRAM" : {
"count" : 1 ,
"min" : 21 ,
"mean" : 21.0 ,
"max" : 21 ,
"stddev" : 0.0 ,
"p50" : 21.0 ,
"p75" : 21.0 ,
"p95" : 21.0 ,
"p98" : 21.0 ,
"p99" : 21.0 ,
"p999" : 21.0
},
"metrics/backend/GET/RESPONSE_TIME_HISTOGRAM" : {
"count" : 2 ,
"min" : 6 ,
"mean" : 12.6852124529148 ,
"max" : 20 ,
"stddev" : 6.992918475157571 ,
"p50" : 6.0 ,
"p75" : 20.0 ,
"p95" : 20.0 ,
"p98" : 20.0 ,
"p99" : 20.0 ,
"p999" : 20.0
},
"metrics/gauges/GET/RESPONSE_TIME_HISTOGRAM" : {
"count" : 1 ,
"min" : 7 ,
"mean" : 7.0 ,
"max" : 7 ,
"stddev" : 0.0 ,
"p50" : 7.0 ,
"p75" : 7.0 ,
"p95" : 7.0 ,
"p98" : 7.0 ,
"p99" : 7.0 ,
"p999" : 7.0
},
"metrics/statistics/GET/RESPONSE_TIME_HISTOGRAM" : {
"count" : 2 ,
"min" : 1 ,
"mean" : 1.4551211076264199 ,
"max" : 2 ,
"stddev" : 0.49798181193626 ,
"p50" : 1.0 ,
"p75" : 2.0 ,
"p95" : 2.0 ,
"p98" : 2.0 ,
"p99" : 2.0 ,
"p999" : 2.0
},
"metrics/system/GET/RESPONSE_TIME_HISTOGRAM" : {
"count" : 2 ,
"min" : 0 ,
"mean" : 8.942674506664073 ,
"max" : 40 ,
"stddev" : 16.665399873223066 ,
"p50" : 0.0 ,
"p75" : 0.0 ,
"p95" : 40.0 ,
"p98" : 40.0 ,
"p99" : 40.0 ,
"p999" : 40.0
},
"metrics/timers/GET/RESPONSE_TIME_HISTOGRAM" : {
"count" : 1 ,
"min" : 3 ,
"mean" : 3.0 ,
"max" : 3 ,
"stddev" : 0.0 ,
"p50" : 3.0 ,
"p75" : 3.0 ,
"p95" : 3.0 ,
"p98" : 3.0 ,
"p99" : 3.0 ,
"p999" : 3.0
},
"system/GET/RESPONSE_TIME_HISTOGRAM" : {
"count" : 1 ,
"min" : 2 ,
"mean" : 2.0 ,
"max" : 2 ,
"stddev" : 0.0 ,
"p50" : 2.0 ,
"p75" : 2.0 ,
"p95" : 2.0 ,
"p98" : 2.0 ,
"p99" : 2.0 ,
"p999" : 2.0
}
} 1.5 获取 meters 指标 Method & Url GET http://localhost:8080/metrics/metersResponse Status Response Body {
"org.apache.hugegraph.api.API.commit-succeed" : {
"count" : 0 ,
"mean_rate" : 0.0 ,
"m15_rate" : 0.0 ,
"m5_rate" : 0.0 ,
"m1_rate" : 0.0 ,
"rate_unit" : "events/second"
},
"org.apache.hugegraph.api.API.expected-error" : {
"count" : 0 ,
"mean_rate" : 0.0 ,
"m15_rate" : 0.0 ,
"m5_rate" : 0.0 ,
"m1_rate" : 0.0 ,
"rate_unit" : "events/second"
},
"org.apache.hugegraph.api.API.illegal-arg" : {
"count" : 0 ,
"mean_rate" : 0.0 ,
"m15_rate" : 0.0 ,
"m5_rate" : 0.0 ,
"m1_rate" : 0.0 ,
"rate_unit" : "events/second"
},
"org.apache.hugegraph.api.API.unknown-error" : {
"count" : 0 ,
"mean_rate" : 0.0 ,
"m15_rate" : 0.0 ,
"m5_rate" : 0.0 ,
"m1_rate" : 0.0 ,
"rate_unit" : "events/second"
},
"org.apache.tinkerpop.gremlin.server.GremlinServer.errors" : {
"count" : 0 ,
"mean_rate" : 0.0 ,
"m15_rate" : 0.0 ,
"m5_rate" : 0.0 ,
"m1_rate" : 0.0 ,
"rate_unit" : "events/second"
}
} 1.6 获取 timers 指标 Method & Url GET http://localhost:8080/metrics/timersResponse Status Response Body {
"org.apache.hugegraph.api.auth.AccessAPI.create" : {
"count" : 0 ,
"min" : 0.0 ,
"mean" : 0.0 ,
"max" : 0.0 ,
"stddev" : 0.0 ,
"p50" : 0.0 ,
"p75" : 0.0 ,
"p95" : 0.0 ,
"p98" : 0.0 ,
"p99" : 0.0 ,
"p999" : 0.0 ,
"duration_unit" : "milliseconds" ,
"mean_rate" : 0.0 ,
"m15_rate" : 0.0 ,
"m5_rate" : 0.0 ,
"m1_rate" : 0.0 ,
"rate_unit" : "calls/second"
},
"org.apache.hugegraph.api.auth.AccessAPI.delete" : {
"count" : 0 ,
"min" : 0.0 ,
"mean" : 0.0 ,
"max" : 0.0 ,
"stddev" : 0.0 ,
"p50" : 0.0 ,
"p75" : 0.0 ,
"p95" : 0.0 ,
"p98" : 0.0 ,
"p99" : 0.0 ,
"p999" : 0.0 ,
"duration_unit" : "milliseconds" ,
"mean_rate" : 0.0 ,
"m15_rate" : 0.0 ,
"m5_rate" : 0.0 ,
"m1_rate" : 0.0 ,
"rate_unit" : "calls/second"
},
...
} 2.统计指标 Params type:如果传值为 json,则以 json 格式返回,否则以 Promethaus 格式返回。 2.1 Method & Url GET http://localhost:8080/metrics/statisticsResponse Status # HELP hugegraph_info
# TYPE hugegraph_info untyped
hugegraph_info{version="0.69",
} 1.0
# HELP metrics_POST
# TYPE metrics_POST gauge
metrics_POST{name=FAILED_REQUEST,} 1
metrics_POST{name=MEAN_RESPONSE_TIME,} 21.0
metrics_POST{
name=MAX_RESPONSE_TIME,
} 21
metrics_POST{name=SUCCESS_REQUEST,
} 0
metrics_POST{
name=TOTAL_REQUEST,
} 1
# HELP metrics_backend_GET
# TYPE metrics_backend_GET gauge
metrics_backend_GET{name=FAILED_REQUEST,
} 0
metrics_backend_GET{
name=MEAN_RESPONSE_TIME,
} 12.6852124529148
metrics_backend_GET{
name=MAX_RESPONSE_TIME,
} 20
metrics_backend_GET{
name=SUCCESS_REQUEST,
} 2
metrics_backend_GET{name=TOTAL_REQUEST,} 2
# HELP system_GET
# TYPE system_GET gauge
system_GET{name=FAILED_REQUEST,} 1
system_GET{name=MEAN_RESPONSE_TIME,} 2.0
system_GET{name=MAX_RESPONSE_TIME,} 2
system_GET{
name=SUCCESS_REQUEST,
} 0
system_GET{name=TOTAL_REQUEST,
} 1
# HELP metrics_gauges_GET
# TYPE metrics_gauges_GET gauge
metrics_gauges_GET{name=FAILED_REQUEST,} 0
metrics_gauges_GET{name=MEAN_RESPONSE_TIME,
} 7.0
metrics_gauges_GET{
name=MAX_RESPONSE_TIME,
} 7
metrics_gauges_GET{
name=SUCCESS_REQUEST,
} 1
metrics_gauges_GET{
name=TOTAL_REQUEST,
} 1
# HELP favicon.ico_GET
# TYPE favicon.ico_GET gauge
favicon.ico_GET{name=FAILED_REQUEST,
} 1
favicon.ico_GET{
name=MEAN_RESPONSE_TIME,
} 1.0
favicon.ico_GET{name=MAX_RESPONSE_TIME,} 1
favicon.ico_GET{name=SUCCESS_REQUEST,} 0
favicon.ico_GET{
name=TOTAL_REQUEST,
} 1
# HELP metrics__GET
# TYPE metrics__GET gauge
metrics__GET{name=FAILED_REQUEST,} 0
metrics__GET{name=MEAN_RESPONSE_TIME,} 10.0
metrics__GET{name=MAX_RESPONSE_TIME,
} 10
metrics__GET{
name=SUCCESS_REQUEST,
} 2
metrics__GET{
name=TOTAL_REQUEST,
} 2
# HELP metrics_system_GET
# TYPE metrics_system_GET gauge
metrics_system_GET{name=FAILED_REQUEST,} 0
metrics_system_GET{name=MEAN_RESPONSE_TIME,
} 8.942674506664073
metrics_system_GET{
name=MAX_RESPONSE_TIME,
} 40
metrics_system_GET{name=SUCCESS_REQUEST,} 2
metrics_system_GET{name=TOTAL_REQUEST,
} 2 Response Body 2.2 Method & Url GET http://localhost:8080/metrics/statistics?type=jsonResponse Status Response Body {
"metrics/POST" : {
"FAILED_REQUEST" : 1 ,
"MEAN_RESPONSE_TIME" : 21 ,
"MAX_RESPONSE_TIME" : 21 ,
"SUCCESS_REQUEST" : 0 ,
"TOTAL_REQUEST" : 1
},
"metrics/backend/GET" : {
"FAILED_REQUEST" : 0 ,
"MEAN_RESPONSE_TIME" : 12.6852124529148 ,
"MAX_RESPONSE_TIME" : 20 ,
"SUCCESS_REQUEST" : 2 ,
"TOTAL_REQUEST" : 2
},
"system/GET" : {
"FAILED_REQUEST" : 1 ,
"MEAN_RESPONSE_TIME" : 2 ,
"MAX_RESPONSE_TIME" : 2 ,
"SUCCESS_REQUEST" : 0 ,
"TOTAL_REQUEST" : 1
},
"metrics/gauges/GET" : {
"FAILED_REQUEST" : 0 ,
"MEAN_RESPONSE_TIME" : 7 ,
"MAX_RESPONSE_TIME" : 7 ,
"SUCCESS_REQUEST" : 1 ,
"TOTAL_REQUEST" : 1
},
"favicon.ico/GET" : {
"FAILED_REQUEST" : 1 ,
"MEAN_RESPONSE_TIME" : 1 ,
"MAX_RESPONSE_TIME" : 1 ,
"SUCCESS_REQUEST" : 0 ,
"TOTAL_REQUEST" : 1
},
"metrics//GET" : {
"FAILED_REQUEST" : 0 ,
"MEAN_RESPONSE_TIME" : 10 ,
"MAX_RESPONSE_TIME" : 10 ,
"SUCCESS_REQUEST" : 2 ,
"TOTAL_REQUEST" : 2
},
"metrics/system/GET" : {
"FAILED_REQUEST" : 0 ,
"MEAN_RESPONSE_TIME" : 8.942674506664073 ,
"MAX_RESPONSE_TIME" : 40 ,
"SUCCESS_REQUEST" : 2 ,
"TOTAL_REQUEST" : 2
}
} 3.系统指标 系统指标主要返回机器运行指标,如内存、线程等信息。
Method & Url GET http://localhost:8080/metrics/systemResponse Status Response Body {
"basic" : {
"mem" : 1010 ,
"mem_total" : 911 ,
"mem_used" : 239 ,
"mem_free" : 671 ,
"mem_unit" : "MB" ,
"processors" : 20 ,
"uptime" : 137503 ,
"systemload_average" : -1.0
},
"heap" : {
"committed" : 911 ,
"init" : 254 ,
"used" : 239 ,
"max" : 3596
},
"nonheap" : {
"committed" : 98 ,
"init" : 2 ,
"used" : 95 ,
"max" : 0
},
"thread" : {
"peak" : 82 ,
"daemon" : 34 ,
"total_started" : 108 ,
"count" : 82
},
"class_loading" : {
"count" : 11495 ,
"loaded" : 11495 ,
"unloaded" : 0
},
"garbage_collector" : {
"ps_scavenge_count" : 16 ,
"ps_scavenge_time" : 155 ,
"ps_marksweep_count" : 3 ,
"ps_marksweep_time" : 494 ,
"time_unit" : "ms"
}
} 4.后端指标 hugeGraph 支持多种后端存储,后端指标包括内存、磁盘等信息。
Method & Url GET http://localhost:8080/metrics/backendResponse Status Response Body {
"hugegraph" : {
"backend" : "rocksdb" ,
"nodes" : 1 ,
"cluster_id" : "local" ,
"servers" : {
"local" : {
"mem_unit" : "MB" ,
"disk_unit" : "GB" ,
"mem_used" : 0.1 ,
"mem_used_readable" : "103.53 KB" ,
"disk_usage" : 0.03 ,
"disk_usage_readable" : "29.03 KB" ,
"block_cache_usage" : 0.00359344482421875 ,
"block_cache_pinned_usage" : 0.00359344482421875 ,
"block_cache_capacity" : 304.0 ,
"estimate_table_readers_mem" : 0.019697189331054688 ,
"size_all_mem_tables" : 0.07421875 ,
"cur_size_all_mem_tables" : 0.07421875 ,
"estimate_live_data_size" : 5.536526441574097E-5 ,
"total_sst_files_size" : 5.536526441574097E-5 ,
"live_sst_files_size" : 5.536526441574097E-5 ,
"estimate_pending_compaction_bytes" : 0.0 ,
"estimate_num_keys" : 0 ,
"num_entries_active_mem_table" : 0 ,
"num_entries_imm_mem_tables" : 0 ,
"num_deletes_active_mem_table" : 0 ,
"num_deletes_imm_mem_tables" : 0 ,
"num_running_flushes" : 0 ,
"mem_table_flush_pending" : 0 ,
"num_running_compactions" : 0 ,
"compaction_pending" : 0 ,
"num_immutable_mem_table" : 0 ,
"num_snapshots" : 0 ,
"oldest_snapshot_time" : 0 ,
"num_live_versions" : 38 ,
"current_super_version_number" : 38
}
}
}
} 1.19 - Other API Other(其他接口)REST 接口:提供版本查询、API 列表、异常堆栈开关、IP 白名单和 Arthas 诊断代理等辅助功能。
11.1 Other 11.1.1 查看HugeGraph的版本信息 Method & Url GET http://localhost:8080/versionsResponse Status Response Body {
"versions" : {
"version" : "v1" ,
"core" : "1.7.0" ,
"gremlin" : "3.5.1" ,
"api" : "0.72.0.0"
}
} 11.1.2 查看服务的概要信息 返回服务名、内核版本、文档地址以及当前节点注册的 API 分组。
Method & Url GET http://localhost:8080/Response Status Response Body swagger_ui 由 restserver.url 拼接得到,apis 是当前节点注册的 API 分组,按名称排序。
{
"service" : "hugegraph" ,
"version" : "1.7.0" ,
"doc" : "https://hugegraph.apache.org/docs/" ,
"api_doc" : "https://hugegraph.apache.org/docs/clients/" ,
"swagger_ui" : "http://127.0.0.1:8080/swagger-ui/index.html" ,
"apis" : [
"arthas" ,
"auth" ,
"cypher" ,
"filter" ,
"graph" ,
"gremlin" ,
"job" ,
"metrics" ,
"profile" ,
"raft" ,
"schema" ,
"space" ,
"traversers" ,
"variables"
]
} 11.1.3 列出服务的全部 API 按 API 分组和资源类列出所有已注册的接口方法,每条记录包含 url、HTTP 方法,以及查询参数的类型和默认值。
Method & Url GET http://localhost:8080/apisResponse Status Response Body 返回内容较长,下面的片段展示了它的结构:
{
"apis" : {
"schema" : {
"PropertyKeyAPI" : [
{
"url" : "graphspaces/{graphspace}/graphs/{graph}/schema/propertykeys" ,
"method" : "GET" ,
"parameters" : [
{
"name" : "names" ,
"type" : "java.util.List<java.lang.String>" ,
"default_value" : null
}
]
}
]
}
}
} 11.1.4 查看和切换异常堆栈开关 服务返回的错误信息中是否带上 exception 和 cause 等异常堆栈字段,由 exception.allow_trace 配置项(默认 true)决定。下面的接口是一个节点级别的运行期覆盖开关:打开时无论配置项取值如何都会带上堆栈。GET 返回的是该覆盖开关的状态,初始为 false。
Method & Url GET http://localhost:8080/exception/traceResponse Status Response Body Method & Url PUT http://localhost:8080/exception/traceRequest Body Response Status Response Body 11.1.5 管理 IP 白名单,该操作需要管理员权限 白名单只在开关打开时生效,参见 white_ip.status 配置项(默认 disable)。
查看白名单 Method & Url GET http://localhost:8080/whiteiplistResponse Status Response Body {
"whiteIpList" : [
"127.0.0.1"
]
} 向白名单添加或删除 IP Params ips: IPv4 地址列表 action: load 表示添加,remove 表示删除 Method & Url POST http://localhost:8080/whiteiplistRequest Body {
"ips" : [
"10.0.0.1" ,
"10.0.0.2"
],
"action" : "load"
} Response Status Response Body existed_ips 是已经在白名单中的地址,added_ips 是新增的地址,illegal_ips 只在存在非法 IPv4 地址时返回。action=remove 时返回的是 removed_ips 和 non_existed_ips。
{
"existed_ips" : [],
"added_ips" : [
"10.0.0.1" ,
"10.0.0.2"
]
} 启用或关闭白名单 Params status: true 表示启用,false 表示关闭 Method & Url PUT http://localhost:8080/whiteiplist?status=trueResponse Status Response Body {
"WhiteIpListOpen" : true
} 11.1.6 启动 Arthas 诊断代理 将 Arthas 代理挂载到正在运行的服务进程上用于诊断。端口、绑定 IP 和禁用命令取自 arthas.telnetPort、arthas.httpPort、arthas.ip 和 arthas.disabledCommands 配置项,参见 配置项 。
Method & Url PUT http://localhost:8080/arthasResponse Status Response Body 返回生效的 Arthas 配置:
{
"arthas.telnetPort" : "8562" ,
"arthas.httpPort" : "8561" ,
"arthas.ip" : "0.0.0.0" ,
"arthas.disabledCommands" : "jad"
} 2 - HugeGraph Java Client 本文的代码都是java语言写的,但其风格与gremlin(groovy)是非常类似的。用户只需要把代码中的变量声明替换成def或直接去掉,
就能将java代码转变为groovy;另外就是每一行语句最后可以不加分号,groovy认为一行就是一条语句。
用户在HugeGraph-Hubble中编写的gremlin(groovy)可以参考本文的java代码,下面会举出几个例子。
1 HugeGraph-Client HugeGraph-Client 是操作 graph 的总入口,用户必须先创建出 HugeGraph-Client 对象,与 HugeGraph-Server 建立连接(伪连接)后,才能获取到 schema、graph 以及 gremlin 的操作入口对象。
HugeGraph-Client 连接服务端已有的图。构造器支持传入 GraphSpace;使用双参数构造器或传入空值时,GraphSpace 默认为 DEFAULT。
// HugeGraphServer 地址:"http://localhost:8080"
// 图的名称:"hugegraph"
HugeClient hugeClient = HugeClient . builder ( "http://localhost:8080" , "hugegraph" )
//.builder("http://localhost:8080", "graphSpaceName", "hugegraph")
. configTimeout ( 20 ) // 默认 20s 超时
. configUser ( "**" , "**" ) // 默认未开启用户权限
. build (); 上述创建 HugeClient 的过程如果失败会抛出异常,用户需要 try-catch。如果成功则继续获取 schema、graph 以及 gremlin 的 manager。
在HugeGraph - Hubble中通过gremlin来操作时,不需要使用HugeClient,可以忽略。
1.1 构造器选项 构造器支持下列选项。所有超时参数的单位都是秒,内部会转换为毫秒。
调用 build() 时,客户端会读取服务端的 API 版本,超出 [0.38, 0.81) 范围时报错。
1.2 操作入口 除 schema、graph 和 gremlin 外,HugeClient 还提供下列入口。图级别的入口只有在指定了图名称时才可用;如果创建客户端时图名称为空,这些入口会返回 null,直到调用 assignGraph(graphSpace, graph) 为止。
客户端还会报告所连服务端支持的能力,调用方可以据此判断,而不必解析版本号:supportsGraphSpace()、supportsCypher()、supportsGraphCreate()、supportsDefaultRole() 和 isServerAuthEnabled()。
2 元数据 2.1 SchemaManager SchemaManager 用于管理 HugeGraph 中的四种元数据,分别是 PropertyKey(属性类型)、VertexLabel(顶点类型)、EdgeLabel(边类型)和 IndexLabel(索引标签)。在定义元数据信息之前必须先创建 SchemaManager 对象。
用户可使用如下方法获得 SchemaManager 对象:
SchemaManager schema = hugeClient . schema () 在HugeGraph-Hubble中通过gremlin创建schema对象:
下面分别介绍四种元数据的定义过程。
2.2 PropertyKey 2.2.1 接口及参数介绍 PropertyKey 用来规范顶点和边的属性的约束,暂不支持定义属性的属性。
PropertyKey 允许定义的约束信息包括:name、datatype、cardinality、aggregateType、writeType、userdata,下面逐一介绍。
name: 属性的名字,用来区分不同的 PropertyKey,不允许有同名的属性; datatype:属性值类型,必须从下表中选择符合具体业务场景的一项显式设置; cardinality:属性值是单值还是多值,多值的情况下又分为允许有重复值和不允许有重复值,该项默认为 single,如有必要可从下表中选择一项设置; aggregateType:同一属性被重复写入时的合并方式,默认为 none,即保留最后写入的值。数值类的选项要求属性为数字类型; aggregateType(AggregateType type) 可以直接设置该项,传入 AggregateType.NONE 即恢复默认。
writeType:属性属于 OLTP 图数据还是 OLAP 计算结果,对于 OLAP 还区分是否带索引,默认为 oltp; userdata:用户可以自己添加一些约束或额外信息,然后自行检查传入的属性是否满足约束,或者必要的时候提取出额外信息 2.2.2 创建 PropertyKey schema . propertyKey ( "name" ). asText (). valueSet (). ifNotExist (). create () 在HugeGraph-Hubble中通过gremlin创建上述PropertyKey对象的语法完全一致,如果用户没有定义出schema变量,应该这样写:
graph . schema (). propertyKey ( "name" ). asText (). valueSet (). ifNotExist (). create () 以下的示例中,gremlin与java的语法完全一致,不再赘述。
ifNotExist():为 create 添加判断机制,若当前 PropertyKey 已经存在则不再创建,否则创建该属性。若不添加判断,在 properkey 已存在的情况下会抛出异常信息,下同,不再赘述。 2.2.3 删除 PropertyKey schema . propertyKey ( "name" ). remove () 2.2.4 查询 PropertyKey // 获取 PropertyKey 对象
schema . getPropertyKey ( "name" )
// 获取 PropertyKey 属性
schema . getPropertyKey ( "name" ). cardinality ()
schema . getPropertyKey ( "name" ). dataType ()
schema . getPropertyKey ( "name" ). name ()
schema . getPropertyKey ( "name" ). userdata () 2.3 VertexLabel 2.3.1 接口及参数介绍 VertexLabel 用来定义顶点类型,描述顶点的约束信息:
VertexLabel 允许定义的约束信息包括:name、idStrategy、properties、primaryKeys、nullableKeys 和 ttl,下面逐一介绍。
name: 属性的名字,用来区分不同的 VertexLabel,不允许有同名的属性; idStrategy: 每一个 VertexLabel 都可以选择自己的 Id 策略,目前有三种策略供选择,即 Automatic(自动生成)、Customize(用户传入)和 PrimaryKey(主属性键)。其中 Automatic 使用 Snowflake 算法生成 Id,Customize 需要用户自行传入字符串或数字类型的 Id,PrimaryKey 则允许用户从 VertexLabel 的属性中选择若干主属性作为区分的依据,HugeGraph 内部会根据主属性的值拼接生成 Id。idStrategy 默认使用 Automatic 的,但如果用户没有显式设置 idStrategy 又调用了 primaryKeys(…) 方法设置了主属性,则 idStrategy 将自动使用 PrimaryKey; properties: 定义顶点的属性,传入的参数是 PropertyKey 的 name primaryKeys: 当用户选择了 PrimaryKey 的 Id 策略时,需要从 VertexLabel 的属性中选择若干主属性作为区分的依据; 需要注意的是,Id 策略的选择与 primaryKeys 的设置有一些相互约束,不能随意调用,约束关系见下表:
客户端自身只校验 Id 策略是否被重复设置,因此在同一个构造器上调用两个上述方法会在本地报错。上表中的组合由服务端校验。
nullableKeys: 对于通过 properties(…) 方法设置过的属性,默认全都是不可为空的,也就是在创建顶点时该属性必须赋值,这样可能对用户数据提出了太过严格的完整性要求。为避免这样的强约束,用户可以通过
本方法设置若干属性为可空的,这样添加顶点时该属性可以不赋值。 注意:primaryKeys 和 nullableKeys 不能有交集,因为一个属性不能既作为主属性,又是可空的。
ttl:该类型顶点的存活时间,默认为 0,即永不过期。客户端会拒绝负值。默认从顶点写入的时刻开始计时;设置 ttlStartTime 后,改为从该 label 的某个日期属性开始计时。 enableLabelIndex:用户可以指定是否需要为 label 创建索引。不创建则无法全局搜索指定 label 的顶点和边,创建则可以全局搜索,做类似于g.V().hasLabel('person'), g.E().has('label', 'person')这样的查询,
但是插入数据时性能上会更加慢,并且需要占用更多的存储空间。此项默认为 true。 userdata:用户可以自己添加一些约束或额外信息,然后自行检查传入的属性是否满足约束,或者必要的时候提取出额外信息 2.3.2 创建 VertexLabel // 使用 Automatic 的 Id 策略
schema . vertexLabel ( "person" ). properties ( "name" , "age" ). ifNotExist (). create ();
schema . vertexLabel ( "person" ). useAutomaticId (). properties ( "name" , "age" ). ifNotExist (). create ();
// 使用 Customize_String 的 Id 策略
schema . vertexLabel ( "person" ). useCustomizeStringId (). properties ( "name" , "age" ). ifNotExist (). create ();
// 使用 Customize_Number 的 Id 策略
schema . vertexLabel ( "person" ). useCustomizeNumberId (). properties ( "name" , "age" ). ifNotExist (). create ();
// 使用 Customize_Uuid 的 Id 策略
schema . vertexLabel ( "person" ). useCustomizeUuidId (). properties ( "name" , "age" ). ifNotExist (). create ();
// 使用 PrimaryKey 的 Id 策略
schema . vertexLabel ( "person" ). properties ( "name" , "age" ). primaryKeys ( "name" ). ifNotExist (). create ();
schema . vertexLabel ( "person" ). usePrimaryKeyId (). properties ( "name" , "age" ). primaryKeys ( "name" ). ifNotExist (). create (); 2.3.3 追加 VertexLabel VertexLabel 是可以追加约束的,不过仅限 properties 和 nullableKeys,而且追加的属性也必须添加到 nullableKeys 集合中。
schema . vertexLabel ( "person" ). properties ( "price" ). nullableKeys ( "price" ). append (); 2.3.4 删除 VertexLabel schema . vertexLabel ( "person" ). remove (); 2.3.5 查询 VertexLabel // 获取 VertexLabel 对象
schema . getVertexLabel ( "name" )
// 获取 property key 属性
schema . getVertexLabel ( "person" ). idStrategy ()
schema . getVertexLabel ( "person" ). primaryKeys ()
schema . getVertexLabel ( "person" ). name ()
schema . getVertexLabel ( "person" ). properties ()
schema . getVertexLabel ( "person" ). nullableKeys ()
schema . getVertexLabel ( "person" ). userdata ()
schema . getVertexLabel ( "person" ). ttl ()
schema . getVertexLabel ( "person" ). ttlStartTime () 2.4 EdgeLabel 2.4.1 接口及参数介绍 EdgeLabel 用来定义边类型,描述边的约束信息。
EdgeLabel 允许定义的约束信息包括:name、sourceLabel、targetLabel、frequency、properties、sortKeys、nullableKeys 和 ttl,下面逐一介绍。
name: 属性的名字,用来区分不同的 EdgeLabel,不允许有同名的属性; sourceLabel 和 targetLabel: 边连接的源顶点类型名和目标顶点类型名,两者都设置等同于声明一组连接。
link: EdgeLabel 内部保存的是一组源顶点和目标顶点的组合,因此 link(...) 可以多次调用,让同一种边连接多组顶点类型。一旦通过这种方式添加过组合,sourceLabel(...) 和 targetLabel(...) 就会被拒绝;同时 sourceLabel() 和 targetLabel() 这两个取值方法只在恰好有一组组合时可用,需要读取全部组合时请使用 links()。
frequency: 字面意思是频率,表示在两个具体的顶点间某个关系出现的次数,可以是单次(single)或多次(frequency),默认为 single; sortKeys: 当 EdgeLabel 的 frequency 为 multiple 时,需要某些属性来区分这多次的关系,故引入了 sortKeys(排序键); nullableKeys: 与顶点中的 nullableKeys 概念一致,不再赘述 注意:sortKeys 和 nullableKeys 也不能有交集。
2.4.2 创建 EdgeLabel schema . edgeLabel ( "knows" ). link ( "person" , "person" ). properties ( "date" ). ifNotExist (). create ();
schema . edgeLabel ( "created" ). multiTimes (). link ( "person" , "software" ). properties ( "date" ). sortKeys ( "date" ). ifNotExist (). create (); 2.4.3 追加 EdgeLabel schema . edgeLabel ( "knows" ). properties ( "price" ). nullableKeys ( "price" ). append (); 2.4.4 删除 EdgeLabel schema . edgeLabel ( "knows" ). remove (); 2.4.5 查询 EdgeLabel // 获取 EdgeLabel 对象
schema . getEdgeLabel ( "knows" )
// 获取 property key 属性
schema . getEdgeLabel ( "knows" ). frequency ()
schema . getEdgeLabel ( "knows" ). sourceLabel ()
schema . getEdgeLabel ( "knows" ). targetLabel ()
schema . getEdgeLabel ( "knows" ). sortKeys ()
schema . getEdgeLabel ( "knows" ). name ()
schema . getEdgeLabel ( "knows" ). properties ()
schema . getEdgeLabel ( "knows" ). nullableKeys ()
schema . getEdgeLabel ( "knows" ). userdata ()
schema . getEdgeLabel ( "knows" ). ttl ()
schema . getEdgeLabel ( "knows" ). ttlStartTime ()
schema . getEdgeLabel ( "knows" ). edgeLabelType ()
// 全部的源顶点和目标顶点组合,存在多组时也可安全调用
schema . getEdgeLabel ( "knows" ). links () 2.5 IndexLabel 2.5.1 接口及参数介绍 IndexLabel 用来定义索引类型,描述索引的约束信息,主要是为了方便查询。
IndexLabel 允许定义的约束信息包括:name、baseType、baseValue、indexFields、indexType,下面逐一介绍。
name: 属性的名字,用来区分不同的 IndexLabel,不允许有同名的属性; baseType: 表示要为 VertexLabel 还是 EdgeLabel 建立索引, 与下面的 baseValue 配合使用;
baseValue: 指定要建立索引的 VertexLabel 或 EdgeLabel 的名称;
indexFields: 要在哪些属性上建立索引,可以是为多列建立联合索引; indexType: 建立的索引类型,目前支持五种,即 Secondary、Range、Search、Shard 和 Unique。Secondary 支持精确匹配的二级索引,允许建立联合索引,联合索引支持索引前缀搜索单个属性,支持相等查询,比如:person 顶点的 city 属性的二级索引,可以用g.V().has("city", "北京") 查询"city 属性值是北京"的全部顶点 联合索引,支持前缀查询和相等查询,比如:person 顶点的 city 和 street 属性的联合索引,可以用g.V().has ("city", "北京").has('street', '中关村街道') 查询"city属性值是北京且street属性值是中关村"的全部顶点,或者g.V() .has("city", "北京")查询"city 属性值是北京"的全部顶点 secondary index 的查询都是基于"是"或者"相等"的查询条件,不支持"部分匹配"
Range 支持数值类型的范围查询必须是单个数字或者日期属性,比如:person 顶点的 age 属性的范围索引,可以用g.V().has("age", P.gt(18)) 查询"age属性值大于18"的顶点。除了P.gt()以外,还支持P.gte(), P.lte(), P.lt(),
P.eq(), P.between(), P.inside()和P.outside()等 Search 支持全文检索的索引必须是单个文本属性,比如:person 顶点的 address 属性的全文索引,可以用g.V().has("address", Text .contains('大厦')查询"address 属性中包含大厦"的全部顶点 search index 的查询是基于"是"或者"包含"的查询条件
Shard 支持前缀匹配 + 数字范围查询的索引N 个属性的分片索引,支持前缀相等情况下的范围查询,比如:person 顶点的 city 和 age 属性的分片索引,可以用g.V().has ("city", "北京").has("age", P.between(18, 30)) 查询"city 属性是北京且年龄大于等于 18 小于 30"的全部顶点 shard index N 个属性全是文本属性时,等价于 secondary index shard index 只有单个数字或者日期属性时,等价于 range index shard index 可以有任意数字或者日期属性,但是查询时最多只能提供一个范围查找条件,且该范围查找条件的属性的前缀属性都是相等查询条件
Unique 支持属性值唯一性约束,即可以限定属性的值不重复,允许联合索引,但不支持查询单个或者多个属性的唯一性索引,不可用来查询,只可对属性的值进行限定,当出现重复值时将报错 2.5.2 创建 IndexLabel schema . indexLabel ( "personByAge" ). onV ( "person" ). by ( "age" ). range (). ifNotExist (). create ();
schema . indexLabel ( "createdByDate" ). onE ( "created" ). by ( "date" ). secondary (). ifNotExist (). create ();
schema . indexLabel ( "personByLived" ). onE ( "person" ). by ( "lived" ). search (). ifNotExist (). create ();
schema . indexLabel ( "personByCityAndAge" ). onV ( "person" ). by ( "city" , "age" ). shard (). ifNotExist (). create ();
schema . indexLabel ( "personById" ). onV ( "person" ). by ( "id" ). unique (). ifNotExist (). create (); 2.5.3 删除 IndexLabel schema . indexLabel ( "personByAge" ). remove () 2.5.4 查询 IndexLabel // 获取 IndexLabel 对象
schema . getIndexLabel ( "personByAge" )
// 获取 property key 属性
schema . getIndexLabel ( "personByAge" ). baseType ()
schema . getIndexLabel ( "personByAge" ). baseValue ()
schema . getIndexLabel ( "personByAge" ). indexFields ()
schema . getIndexLabel ( "personByAge" ). indexType ()
schema . getIndexLabel ( "personByAge" ). name () 3 图数据 3.1 Vertex 顶点是构成图的最基本元素,一个图中可以有非常多的顶点。下面给出一个添加顶点的例子:
Vertex marko = graph . addVertex ( T . LABEL , "person" , "name" , "marko" , "age" , 29 );
Vertex lop = graph . addVertex ( T . LABEL , "software" , "name" , "lop" , "lang" , "java" , "price" , 328 ); 添加顶点的关键是顶点属性,添加顶点函数的参数个数必须为偶数,且满足key1 -> val1, key2 -> val2 ···的顺序排列,键值对之间的顺序是自由的。 参数中必须包含一对特殊的键值对,就是T.LABEL -> "val",用来定义该顶点的类别,以便于程序从缓存或后端获取到该 VertexLabel 的 schema 定义,然后做后续的约束检查。例子中的 label 定义为 person。T.LABEL 就是常量 "label",直接传入该字符串效果相同。 如果顶点类型的 Id 策略为 AUTOMATIC,则不允许用户传入 id 键值对。 如果顶点类型的 Id 策略为 CUSTOMIZE_STRING,则用户需要自己传入 String 类型 id 的值,键值对形如:T.ID, "123456"。 如果顶点类型的 Id 策略为 CUSTOMIZE_NUMBER,则用户需要自己传入 Number 类型 id 的值,键值对形如:T.ID, 123456。 如果顶点类型的 Id 策略为 PRIMARY_KEY,参数还必须全部包含该primaryKeys对应属性的名和值,如果不设置会抛出异常。比如之前person的primaryKeys是name,例子中就设置了name的值为marko。 对于非 nullableKeys 的属性,必须要赋值。 剩下的参数就是顶点其他属性的设置,但并非必须。 调用addVertex方法后,顶点会立刻被插入到后端存储系统中。 3.2 Edge 有了点,还需要边才能构成完整的图。下面给出一个添加边的例子:
Edge knows1 = marko . addEdge ( "knows" , vadas , "city" , "Beijing" ); 由(源)顶点来调用添加边的函数,函数第一个参数为边的 label,第二个参数是目标顶点,这两个参数的位置和顺序是固定的。后续的参数就是key1 -> val1, key2 -> val2 ···的顺序排列,设置边的属性,键值对顺序自由。 源顶点和目标顶点必须符合 EdgeLabel 中 source-label 和 target-label 的定义,不能随意添加。 对于非 nullableKeys 的属性,必须要赋值。 注意:当 frequency 为 multiple 时必须要设置 sortKeys 对应属性类型的值。
4 图管理 Client 支持管理一个物理部署中的多个 GraphSpace,每个 GraphSpace 可以包含多个图。不指定 GraphSpace 时使用 DEFAULT。
GraphSpace 需要服务端 core 版本不低于 1.7.0。连接更早的服务端时,客户端会退回到 legacy 模式,此时 hugeClient.supportsGraphSpace() 返回 false。
4.1 创建GraphSpace GraphSpaceManager spaceManager = hugeClient . graphSpace ();
// 定义 GraphSpace 配置
GraphSpace graphSpace = new GraphSpace ();
graphSpace . setName ( "myGraphSpace" );
graphSpace . setDescription ( "Business data graph space" );
graphSpace . setMaxGraphNumber ( 10 ); // 最大图数量
graphSpace . setMaxRoleNumber ( 100 ); // 最大角色数量
// 创建 GraphSpace
spaceManager . createGraphSpace ( graphSpace ); 4.2 GraphSpace 接口汇总 5 简单示例 简单示例见HugeGraph-Client
3 - Gremlin-Console Gremlin-Console 是由 Tinkerpop 自己开发的一个交互式客户端,用户可以使用该客户端对 Graph 做各种操作,主要有两种使用模式:
单机离线调用模式 Client/Server 请求模式 注:Gremlin-Console 只是便于用户快速上手体验,不建议在生产环境中使用。
1 单机离线调用模式 由于 lib 目录下已经包含了 HugeCore 的 jar 包,且 HugeGraph-Server 已经作为插件注册到 Gremlin-Console 中,用户可以直接写 Groovy 脚本调用 HugeGraph-Core 的代码,然后交由 Gremlin-Console 内的解析引擎执行,就能在不启动 Server 的情况下操作图。
这里提供一个示例,首先修改 hugegraph.properties 配置使用 Memory 后端 (使用其他后端可能会出现一些初始化问题):
backend = memory
serializer = text 然后输入下述命令:
> ./bin/gremlin-console.sh -- -i scripts/example.groovy
\, ,,/
( o o)
-----oOOo-( 3) -oOOo-----
plugin activated: HugeGraph
plugin activated: tinkerpop.server
plugin activated: tinkerpop.utilities
plugin activated: tinkerpop.tinkergraph
main dict load finished, time elapsed 644 ms
model load finished, time elapsed 35 ms.
>>>> query all vertices: size = 6
>>>> query all edges: size = 6
gremlin> 这里的 -- 会被 getopts 解析为最后一个 option,这样后面的 options 就可以传入 Gremlin-Console 进行处理了。-i 代表 Execute the specified script and leave the console open on completion,更多的选项可以参考 Gremlin-Console 的源代码 。
其中 example.groovy 是 scripts 目录下的一个示例脚本,该脚本插入了一些数据,并在最后查询图中顶点和边的数量。
此时还可以继续输入 Gremlin 语句对图进行操作:
gremlin > g . V ()
==> v [ 2 : lop ]
==> v [ 1 : josh ]
==> v [ 1 : marko ]
==> v [ 1 : peter ]
==> v [ 1 : vadas ]
==> v [ 2 : ripple ]
gremlin > g . E ()
==> e [ S1: josh > 2 >> S2: lop ][ 1 : josh - created -> 2 : lop ]
==> e [ S1: josh > 2 >> S2: ripple ][ 1 : josh - created -> 2 : ripple ]
==> e [ S1: marko > 1 >> S1: josh ][ 1 : marko - knows -> 1 : josh ]
==> e [ S1: marko > 1 >> S1: vadas ][ 1 : marko - knows -> 1 : vadas ]
==> e [ S1: marko > 2 >> S2: lop ][ 1 : marko - created -> 2 : lop ]
==> e [ S1: peter > 2 >> S2: lop ][ 1 : peter - created -> 2 : lop ]
gremlin > 更多的 Gremlin 语句请参考 Tinkerpop 官网 。
2 Client/Server 请求模式 Gremlin-Console 通过 WebSocket 连接 HugeGraph-Server。默认配置使用 WsAndHttpChannelizer,可同时处理 WebSocket 和 HTTP 请求,无需切换 Channelizer。
# vim conf/gremlin-server.yaml
# ......
channelizer : org.apache.tinkerpop.gremlin.server.channel.WsAndHttpChannelizer
# ...... 确认 host、port 与 remote.yaml 一致,然后按照步骤 启动 HugeGraph-Server。
下面进入 Gremlin-Console:
> ./bin/gremlin-console.sh
\, ,,/
( o o)
-----oOOo-( 3) -oOOo-----
plugin activated: HugeGraph
plugin activated: tinkerpop.server
plugin activated: tinkerpop.utilities
plugin activated: tinkerpop.tinkergraph 连接 Server,需在配置文件中指定连接参数,在 conf 目录下有一个默认的 remote.yaml:
# cat conf/remote.yaml
hosts : [ localhost]
port : 8182
serializer : {
className : org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
config : {
serializeResultToString : false ,
ioRegistries : [ org.apache.hugegraph.io.HugeGraphIoRegistry]
}
} 如果 Server 开启了鉴权模式,需要在同一个文件中补上凭据:
username : admin
password : pa conf 目录下还提供了 remote-objects.yaml 和 gremlin-driver-settings.yaml,它们使用相同的 host、port 和序列化器配置。
gremlin > : remote connect tinkerpop . server conf /remote.yaml
==>Configured localhost/ 127.0 . 0.1 : 8182 Server 端的图以图空间限定名绑定,因此图空间 DEFAULT 下的图 hugegraph 绑定名为 DEFAULT-hugegraph,其 traversal source 绑定名为 __g_DEFAULT-hugegraph。裸写 hugegraph 在 Server 端无法解析,而 DEFAULT-hugegraph 又不是合法的 Groovy 标识符,所以远程脚本需要通过别名访问 traversal source。如果启动 HugeGraph-Server 时预加载了示例图,查询方式如下:
gremlin > import org.apache.tinkerpop.gremlin.driver.Cluster
gremlin > cluster = Cluster . open ( 'conf/remote.yaml' )
gremlin > client = cluster . connect (). alias ([ 'g' : '__g_DEFAULT-hugegraph' ])
gremlin > client . submit ( 'g.V().count()' ). all (). get ()[ 0 ]. object
==> 6
gremlin > client . submit ( 'g.V().toList().size()' ). all (). get ()[ 0 ]. object
==> 6
gremlin > client . close (); cluster . close () 注意:在 Client/Server 模式下,所有和 Server 有关的操作都要加上 :> ,如果不加,表示在 console 本地操作。:> 发送的脚本不带别名,因此只能使用 Server 自身已绑定的名称。
更多关于 Gremlin-Console 的使用,请参考 Tinkerpop 官网 。