Manage Vertices (Optional)
Vertices are the two end points of an edge, and logically stored in columns of a service. If your use case requires storing metadata corresponding to vertices rather than edges, there are operations available on vertices as well.
Vertex Fields
Unlike edges and their labels, properties of a vertex are not indexed nor require a predefined schema. The following fields are used when operating on vertices.
Field Name | Definition | Data Type | Example | Remarks |
---|---|---|---|---|
timestamp | Long | 1417616431 | Required. Unix Epoch time in milliseconds. | |
operation | One of insert, delete, update, increment | String | "i", "insert" | Required only for bulk operations. Alias are also available: i (insert), d (delete), u (update), in (increment). Default is insert. |
serviceName | Corresponding service name | String | "kakaotalk"/"kakaogroup" | Required. |
columnName | Corresponding column name | String | "user_id" | Required. |
id | Unique identifier of vertex | Long/ String | 101 | Required. Use Long if possible. |
props | Additional properties of vertex. | JSON (dictionary) | {"is_active_user": true, "age":10, "gender": "F", "country_iso": "kr"} | Required. |
Basic Vertex Operations
Insert - POST /graphs/vertices/insert/:serviceName/:columnName
curl -XPOST localhost:9000/graphs/vertices/insert/s2graph/account_id -H 'Content-Type: Application/json' -d '
[
{"id":1,"props":{"is_active":true, "talk_user_id":10},"timestamp":1417616431000},
{"id":2,"props":{"is_active":true, "talk_user_id":12},"timestamp":1417616431000},
{"id":3,"props":{"is_active":false, "talk_user_id":13},"timestamp":1417616431000},
{"id":4,"props":{"is_active":true, "talk_user_id":14},"timestamp":1417616431000},
{"id":5,"props":{"is_active":true, "talk_user_id":15},"timestamp":1417616431000}
]
'
Delete - POST /graphs/vertices/delete/:serviceName/:columnName
curl -XPOST localhost:9000/graphs/vertices/delete/s2graph/account_id -H 'Content-Type: Application/json' -d '
[
{"id":1,"timestamp":1417616431001},
{"id":2,"timestamp":1417616431002}
]
'
This operation will delete only the vertex data of a specified column and will not delete any edges connected to those vertices.
Also important thing is timestamp. vertex will be deleted only if delete requests timestamp is larger than all of vertex
s property`s timestamp.
following example shows the difference.
curl -XPOST localhost:9000/graphs/vertices/insert/s2graph_test/account_id -H 'Content-Type: Application/json' -d '
[
{"id":1,"props":{"is_active":true, "talk_user_id":10},"timestamp":1417616431000},
{"id":1,"props":{"talk_user_id":20},"timestamp":1417616431002}
]
'
if user request delete(ts) on vertex like below then vertex would not be deleted, but only properties on this vertex that is updated before ts will be deleted.
curl -XPOST localhost:9000/graphs/vertices/delete/s2graph_test/account_id -H 'Content-Type: Application/json' -d '
[
{"id":1,"timestamp":1417616431001}
]
'
then result still have vertex with property that is updated with larger timestamp.
curl -XPOST localhost:9000/graphs/getVertices -H 'Content-Type: Application/json' -d '
[
{"serviceName": "s2graph_test", "columnName": "account_id", "ids": [1]}
]
'
- result
{
"serviceName": "s2graph_test",
"columnName": "account_id",
"id": 1,
"props": {
"talk_user_id": 20
},
"timestamp": 1417616431002
}
Important notes
This means that edges returned by a query can contain deleted vertices. Clients are responsible for checking validity of the vertices.
Delete All - POST /graphs/vertices/deleteAll/:serviceName/:columnName
This operation will delete all vertices and connected edges in a given column.
curl -XPOST localhost:9000/graphs/vertices/deleteAll/s2graph/account_id -H 'Content-Type: Application/json' -d '
[{"id": 1, "timestamp": 193829198000}]
'
This is a very expensive operation. If you're interested in what goes on under the hood, please refer to the following pseudocode:
vertices = vertex list to delete
for vertex in vertices
labels = fetch all labels that this vertex is included.
for label in labels
for index in label.indices
edges = G.read with limit 50K
for edge in edges
edge.delete
The total complexity is O(L L.I) reads + O(L L.I 50K) writes, worst case. *If the vertex you're trying to delete has more than 50K edges, the deletion will not be consistent.
Update - POST /graphs/vertices/insert/:serviceName/:columnName
Basically update on Vertex is same with insert overwrite so use insert for update.
Increment
Not yet implemented; stay tuned.