| #!/usr/bin/env bash |
| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. |
| # The ASF licenses this file to You under the Apache License, Version 2.0 |
| # (the "License"); you may not use this file except in compliance with |
| # the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| printf "\n\n" |
| printf "As a toy problem, let's try to create the backend for a simple timeline of a new social network service.\n" |
| printf "(Think of a simplified version of Facebook's Timeline.)\n" |
| printf "You will be able to manage 'friends' and 'posts' of a user with simple S2Graph queries.\n\n" |
| |
| printf "First, we need a name for the new service. \n Why don't we call it Kakao Favorites? \n" |
| read -r -p 'Step 1: Creating Service >>> ' var |
| |
| curl -XPOST localhost:9000/graphs/createService -H 'Content-Type: Application/json' -d ' |
| {"serviceName": "KakaoFavorites", "compressionAlgorithm" : "gz"} |
| ' |
| |
| printf "\n\n" |
| |
| read -r -p 'Make Sure the service is created correctly. >>> ' var |
| |
| curl -XGET localhost:9000/graphs/getService/KakaoFavorites |
| |
| # 2. Next, we will need some friends. |
| # In S2Graph, relationships are defined as Labels. |
| # Create a friends label with the following createLabel API call: |
| printf "\n\n\nNext, we will need some friends. \nIn S2Graph, relationships are defined as Labels.\nCreate a friends label with the following createLabel API call:\n" |
| read -r -p 'Step 2: Create Label >>> ' var |
| |
| payload=' |
| { |
| "label": "friends", |
| "srcServiceName": "KakaoFavorites", |
| "srcColumnName": "userName", |
| "srcColumnType": "string", |
| "tgtServiceName": "KakaoFavorites", |
| "tgtColumnName": "userName", |
| "tgtColumnType": "string", |
| "isDirected": "false", |
| "indices": [], |
| "props": [], |
| "consistencyLevel": "strong" |
| } |
| ' |
| printf "\n$payload\n" |
| curl -XPOST localhost:9000/graphs/createLabel -H 'Content-Type: Application/json' -d ' |
| { |
| "label": "friends", |
| "srcServiceName": "KakaoFavorites", |
| "srcColumnName": "userName", |
| "srcColumnType": "string", |
| "tgtServiceName": "KakaoFavorites", |
| "tgtColumnName": "userName", |
| "tgtColumnType": "string", |
| "isDirected": "false", |
| "indices": [], |
| "props": [], |
| "consistencyLevel": "strong" |
| } |
| ' |
| |
| # Check the label: |
| printf "\n\n" |
| read -r -p 'Make Sure Label has been created correctly >>> ' var |
| |
| curl -XGET localhost:9000/graphs/getLabel/friends |
| |
| # Now that the label friends is ready, we can store friend entries. |
| # Entries of a label are called edges, and you can add edges with the edges/insertWithWait API: |
| printf "\n\nNow that the label friends is ready, we can store friend entries.\nEntries of a label are called edges, and you can add edges with the edges/insertWithWait API:\n" |
| read -r -p 'Step 3: Insert Edges >>> ' var |
| payload=' |
| [ |
| {"from":"Elmo","to":"Big Bird","label":"friends","props":{},"timestamp":1444360152477}, |
| {"from":"Elmo","to":"Ernie","label":"friends","props":{},"timestamp":1444360152478}, |
| {"from":"Elmo","to":"Bert","label":"friends","props":{},"timestamp":1444360152479}, |
| |
| {"from":"Cookie Monster","to":"Grover","label":"friends","props":{},"timestamp":1444360152480}, |
| {"from":"Cookie Monster","to":"Kermit","label":"friends","props":{},"timestamp":1444360152481}, |
| {"from":"Cookie Monster","to":"Oscar","label":"friends","props":{},"timestamp":1444360152482} |
| ] |
| ' |
| printf "\n$payload\n" |
| curl -XPOST localhost:9000/graphs/edges/insertWithWait -H 'Content-Type: Application/json' -d ' |
| [ |
| {"from":"Elmo","to":"Big Bird","label":"friends","props":{},"timestamp":1444360152477}, |
| {"from":"Elmo","to":"Ernie","label":"friends","props":{},"timestamp":1444360152478}, |
| {"from":"Elmo","to":"Bert","label":"friends","props":{},"timestamp":1444360152479}, |
| |
| {"from":"Cookie Monster","to":"Grover","label":"friends","props":{},"timestamp":1444360152480}, |
| {"from":"Cookie Monster","to":"Kermit","label":"friends","props":{},"timestamp":1444360152481}, |
| {"from":"Cookie Monster","to":"Oscar","label":"friends","props":{},"timestamp":1444360152482} |
| ] |
| ' |
| printf "\n\n" |
| read -r -p 'Step 4: Query friends of Elmo with getEdges API: >>> ' var |
| |
| # Query friends of Elmo with getEdges API: |
| curl -XPOST localhost:9000/graphs/getEdges -H 'Content-Type: Application/json' -d ' |
| { |
| "select": ["to"], |
| "srcVertices": [{"serviceName": "KakaoFavorites", "columnName": "userName", "id":"Elmo"}], |
| "steps": [ |
| {"step": [{"label": "friends", "direction": "out", "offset": 0, "limit": 10}]} |
| ] |
| } |
| ' |
| printf "\n\n" |
| read -r -p 'Step 5: Now query friends of Cookie Monster: >>> ' var |
| # Now query friends of Cookie Monster: |
| curl -XPOST localhost:9000/graphs/getEdges -H 'Content-Type: Application/json' -d ' |
| { |
| "select": ["to"], |
| "srcVertices": [{"serviceName": "KakaoFavorites", "columnName": "userName", "id":"Cookie Monster"}], |
| "steps": [ |
| {"step": [{"label": "friends", "direction": "out", "offset": 0, "limit": 10}]} |
| ] |
| } |
| ' |
| |
| |
| # 3. Users of Kakao Favorites will be able to post URLs of their favorite websites. |
| # We will need a new label post for this data: |
| printf "\n\nUsers of Kakao Favorites will be able to post URLs of their favorite websites.\nWe will need a new label post for this data\n" |
| read -r -p 'Step 6: Create Label for Users of Kakao Favorites will be able to post URLs of their favorite websites. >>> ' var |
| payload=' |
| { |
| "label": "post", |
| "srcServiceName": "KakaoFavorites", |
| "srcColumnName": "userName", |
| "srcColumnType": "string", |
| "tgtServiceName": "KakaoFavorites", |
| "tgtColumnName": "url", |
| "tgtColumnType": "string", |
| "isDirected": "true", |
| "indices": [], |
| "props": [], |
| "consistencyLevel": "strong" |
| } |
| ' |
| printf "\n$payload\n" |
| curl -XPOST localhost:9000/graphs/createLabel -H 'Content-Type: Application/json' -d ' |
| { |
| "label": "post", |
| "srcServiceName": "KakaoFavorites", |
| "srcColumnName": "userName", |
| "srcColumnType": "string", |
| "tgtServiceName": "KakaoFavorites", |
| "tgtColumnName": "url", |
| "tgtColumnType": "string", |
| "isDirected": "true", |
| "indices": [], |
| "props": [], |
| "consistencyLevel": "strong" |
| } |
| ' |
| |
| # Now, insert some posts of our users: |
| |
| payload=' |
| [ |
| {"from":"Big Bird","to":"www.kakaocorp.com/en/main","label":"post","props":{},"timestamp":1444360152477}, |
| {"from":"Big Bird","to":"github.com/kakao/s2graph","label":"post","props":{},"timestamp":1444360152478}, |
| {"from":"Ernie","to":"groups.google.com/forum/#!forum/s2graph","label":"post","props":{},"timestamp":1444360152479}, |
| {"from":"Grover","to":"hbase.apache.org/forum/#!forum/s2graph","label":"post","props":{},"timestamp":1444360152480}, |
| {"from":"Kermit","to":"www.playframework.com","label":"post","props":{},"timestamp":1444360152481}, |
| {"from":"Oscar","to":"www.scala-lang.org","label":"post","props":{},"timestamp":1444360152482} |
| ] |
| ' |
| printf "\n\n" |
| read -r -p 'Step 7: Now, insert some posts of our users. >>> ' var |
| printf "\n$payload\n" |
| curl -XPOST localhost:9000/graphs/edges/insertWithWait -H 'Content-Type: Application/json' -d ' |
| [ |
| {"from":"Big Bird","to":"www.kakaocorp.com/en/main","label":"post","props":{},"timestamp":1444360152477}, |
| {"from":"Big Bird","to":"github.com/kakao/s2graph","label":"post","props":{},"timestamp":1444360152478}, |
| {"from":"Ernie","to":"groups.google.com/forum/#!forum/s2graph","label":"post","props":{},"timestamp":1444360152479}, |
| {"from":"Grover","to":"hbase.apache.org/forum/#!forum/s2graph","label":"post","props":{},"timestamp":1444360152480}, |
| {"from":"Kermit","to":"www.playframework.com","label":"post","props":{},"timestamp":1444360152481}, |
| {"from":"Oscar","to":"www.scala-lang.org","label":"post","props":{},"timestamp":1444360152482} |
| ] |
| ' |
| |
| # Query posts of Big Bird: |
| printf "\n\n" |
| read -r -p 'Step 8: Query posts of Big Bird. >>> ' var |
| curl -XPOST localhost:9000/graphs/getEdges -H 'Content-Type: Application/json' -d ' |
| { |
| "select": ["to"], |
| "srcVertices": [{"serviceName": "KakaoFavorites", "columnName": "userName", "id":"Big Bird"}], |
| "steps": [ |
| {"step": [{"label": "post", "direction": "out", "offset": 0, "limit": 10}]} |
| ] |
| } |
| ' |
| |
| |
| # 4. So far, we designed a label schema for your user relation data friends and post as well as stored some sample edges. |
| # While doing so, we have also prepared ourselves for our timeline query! |
| # The following two-step query will return URLs for Elmo's timeline, which are posts of Elmo's friends: |
| printf "\n\n" |
| read -r -p 'Step 9: Elmo`s Timeline. >>> ' var |
| curl -XPOST localhost:9000/graphs/getEdges -H 'Content-Type: Application/json' -d ' |
| { |
| "select": ["from", "to"], |
| "srcVertices": [{"serviceName": "KakaoFavorites", "columnName": "userName", "id":"Elmo"}], |
| "steps": [ |
| {"step": [{"label": "friends", "direction": "out", "offset": 0, "limit": 10}]}, |
| {"step": [{"label": "post", "direction": "out", "offset": 0, "limit": 10}]} |
| ] |
| } |
| ' |
| |
| # Also try Cookie Monster's timeline: |
| printf "\n\n" |
| read -r -p 'Step 10: Also try Cookie Monsters timeline: >>> ' var |
| curl -XPOST localhost:9000/graphs/getEdges -H 'Content-Type: Application/json' -d ' |
| { |
| "select": ["from", "to"], |
| "srcVertices": [{"serviceName": "KakaoFavorites", "columnName": "userName", "id":"Cookie Monster"}], |
| "steps": [ |
| {"step": [{"label": "friends", "direction": "out", "offset": 0, "limit": 10}]}, |
| {"step": [{"label": "post", "direction": "out", "offset": 0, "limit": 10}]} |
| ] |
| } |
| ' |
| |
| printf "\n\nThe above example is by no means a full-blown social network timeline, but it gives you an idea on how to represent, store and query relations with S2Graph.\n\n" |