| **************************** |
| 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. |
| |
| |
| .. csv-table:: Option |
| :header: "Field Name", "Definition", "Data Type", "Example", "Note" |
| :widths: 15, 30, 30, 30, 30 |
| |
| "timestamp", "Issue time of request", "Long", "1430116731156", "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 /mutate/vertex/insert/:serviceName/:columnName`` |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| |
| .. code:: bash |
| |
| curl -XPOST localhost:9000/mutate/vertex/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 /mutate/vertex/delete/:serviceName/:columnName`` |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| .. code:: bash |
| |
| curl -XPOST localhost:9000/mutate/vertex/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 vertexs`` property`s timestamp. |
| |
| following example shows the difference. |
| |
| .. code:: bash |
| |
| curl -XPOST localhost:9000/mutate/vertex/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. |
| |
| .. code:: bash |
| |
| curl -XPOST localhost:9000/mutate/vertex/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. |
| |
| |
| .. code:: bash |
| |
| 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** |
| |
| .. note:: |
| This means that edges returned by a query can contain deleted vertices. Clients are responsible for checking validity of the vertices. |
| |
| Delete All - ``POST /mutate/vertex/deleteAll/:serviceName/:columnName`` |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| This is a **very expensive** operation. If you're interested in what goes on under the hood, please refer to the following pseudocode: |
| |
| .. code:: python |
| |
| 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 /mutate/vertex/insert/:serviceName/:columnName |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Basically update on Vertex is same with insert overwrite so use insert for update. |
| |
| Increment |
| ~~~~~~~~~~~ |
| |
| Not yet implemented; stay tuned. |