blob: 06cc61ea90a581c96fe311700db17ba59a2ad531 [file] [log] [blame]
****************************
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.