You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@s2graph.apache.org by st...@apache.org on 2016/09/12 14:40:30 UTC
incubator-s2graph git commit: [S2GRAPH-109]: Merge duplicate test.sh
into one same as `Your First Graph` on README.md
Repository: incubator-s2graph
Updated Branches:
refs/heads/master 224c7370a -> 69c18afd2
[S2GRAPH-109]: Merge duplicate test.sh into one same as `Your First Graph` on README.md
JIRA:
[S2GRAPH-109] https://issues.apache.org/jira/browse/S2GRAPH-109
Pull Request:
Closes #78
Authors
DO YUNG YOON: steamshon@apache.org
Project: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/commit/69c18afd
Tree: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/tree/69c18afd
Diff: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/diff/69c18afd
Branch: refs/heads/master
Commit: 69c18afd2c2f763e845e0ee6e049ac7a2a07b41b
Parents: 224c737
Author: DO YUNG YOON <st...@apache.org>
Authored: Mon Sep 12 23:45:07 2016 +0900
Committer: DO YUNG YOON <st...@apache.org>
Committed: Mon Sep 12 23:45:07 2016 +0900
----------------------------------------------------------------------
CHANGES | 2 +
README.md | 2 +
bin/example.sh | 225 ++++++++++++++++++++++++++++++++++++++++++++++++++++
script/test.sh | 177 -----------------------------------------
test.sh | 58 --------------
5 files changed, 229 insertions(+), 235 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/69c18afd/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 91cc36f..dbdb9e3 100644
--- a/CHANGES
+++ b/CHANGES
@@ -180,6 +180,8 @@ Release 0.12.1 - unreleased
S2GRAPH-84: Test-case compilation error on `s2counter_loader` project (Committed by Jaesang Kim).
S2GRAPH-104: force scalaz-stream, netty-http-pipelining dependencies version which is available on maven central (Committed by DOYUNG YOON).
+
+ S2GRAPH-109: Merge duplicate test.sh into one same as `Your First Graph` on README.md (Committed by DOYUNG YOON).
S2GRAPH-106: Remove warnings while package (Committed by DOYUNG YOON).
http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/69c18afd/README.md
----------------------------------------------------------------------
diff --git a/README.md b/README.md
index 73a683f..aecc65d 100644
--- a/README.md
+++ b/README.md
@@ -71,6 +71,8 @@ The first three projects are for OLTP-style workloads, currently the main target
Your First Graph
================
+Once S2Graph server is up, let's try out small toy example. `bin/example.sh` can be used to go through following example.
+
As a toy problem, let's try to create the backend for a simple timeline of a new social network service. (Think of a simplified version of Facebook's Timeline. :stuck_out_tongue_winking_eye:)
You will be able to manage "friends" and "posts" of a user with simple S2Graph queries.
http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/69c18afd/bin/example.sh
----------------------------------------------------------------------
diff --git a/bin/example.sh b/bin/example.sh
new file mode 100755
index 0000000..9a1e354
--- /dev/null
+++ b/bin/example.sh
@@ -0,0 +1,225 @@
+#!/usr/bin/env bash
+
+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"
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/69c18afd/script/test.sh
----------------------------------------------------------------------
diff --git a/script/test.sh b/script/test.sh
deleted file mode 100644
index eba3934..0000000
--- a/script/test.sh
+++ /dev/null
@@ -1,177 +0,0 @@
-#!/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.
-# create service.
-curl -XPOST localhost:9000/graphs/createService -H 'Content-Type: Application/json' -d '
-{"serviceName": "s2graph", "compressionAlgorithm" : "gz"}
-'
-# check service.
-curl -XGET localhost:9000/graphs/getService/s2graph
-
-# create label.
-curl -XPUT localhost:9000/graphs/deleteLabel/graph_test
-curl -XPOST localhost:9000/graphs/createLabel -H 'Content-Type: Application/json' -d '
-{
- "label": "graph_test",
- "srcServiceName": "s2graph",
- "srcColumnName": "account_id",
- "srcColumnType": "long",
- "tgtServiceName": "s2graph",
- "tgtColumnName": "item_id",
- "tgtColumnType": "string",
- "indices": [ { "name": "idx_time_weight", "propNames": ["time", "weight"]} ],
- "props": [
- {"name": "time", "dataType": "integer", "defaultValue": 0},
- {"name": "weight","dataType": "float","defaultValue": 0.0},
- {"name": "is_hidden","dataType": "boolean","defaultValue": false},
- {"name": "is_blocked","dataType": "boolean","defaultValue": false}
- ],
- "consistencyLevel": "strong"
-}
-'
-curl -XPUT localhost:9000/graphs/deleteLabel/graph_test_2
-curl -XPOST localhost:9000/graphs/createLabel -H 'Content-Type: Application/json' -d '
-{
- "label": "graph_test_2",
- "srcServiceName": "s2graph",
- "srcColumnName": "account_id",
- "srcColumnType": "long",
- "tgtServiceName": "s2graph",
- "tgtColumnName": "item_id",
- "tgtColumnType": "string",
- "indices": [ { "name": "idx_time_weight", "propNames": ["time", "weight"]} ],
- "props": [
- {"name": "time", "dataType": "integer", "defaultValue": 0},
- {"name": "weight","dataType": "float","defaultValue": 0.0},
- {"name": "is_hidden","dataType": "boolean","defaultValue": false},
- {"name": "is_blocked","dataType": "boolean","defaultValue": false}
- ],
- "consistencyLevel": "strong"
-}
-'
-
-# check labels
-curl -XGET localhost:9000/graphs/getLabel/graph_test
-curl -XGET localhost:9000/graphs/getLabel/graph_test_2
-
-# app props
-curl -XPOST localhost:9000/graphs/addProp/graph_test -H 'Content-Type: Application/json' -d '
-{"name": "rel_type", "defaultValue": 0, "dataType": "integer"}
-'
-
-curl -XPOST localhost:9000/graphs/addProp/graph_test -H 'Content-Type: Application/json' -d '
-{"name": "play_count", "defaultValue": 0, "dataType": "integer"}
-'
-
-curl -XPOST localhost:9000/graphs/addProp/graph_test -H 'Content-Type: Application/json' -d '
-{"name": "pay_amount", "defaultValue": 0, "dataType": "integer"}
-'
-
-# check if props is added correctly
-curl -XGET localhost:9000/graphs/getLabel/graph_test
-
-# add extra index
-curl -XPOST localhost:9000/graphs/addIndex -H 'Content-Type: Application/json' -d '
-{
- "label": "graph_test",
- "indices": [ {"name": "idx_play_count_pay_amount", "propNames": ["play_count", "pay_amount"]} ]
-}
-'
-
-# check if new index is added correcly
-curl -XGET localhost:9000/graphs/getLabel/graph_test
-
-
-# add edges
-curl -XPOST localhost:9000/graphs/edges/insert -H 'Content-Type: Application/json' -d '
-[
- {"from":1,"to":"ab","label":"graph_test","props":{"time":-1, "weight":0.98},"timestamp":1442502000000},
- {"from":1,"to":"123456","label":"graph_test","props":{"time":0, "weight":0.81},"timestamp":1442502000010},
- {"from":1,"to":"zdfdk2384","label":"graph_test","props":{"time":1, "weight":1.0},"timestamp":1442502000020},
- {"from":1,"to":"dfjkdjfdk1234","label":"graph_test","props":{"time":-2, "weight":0.71},"timestamp":1442502000030},
- {"from":1,"to":"ab","label":"graph_test_2","props":{"time":-1, "weight":0.98},"timestamp":1442502000040},
- {"from":1,"to":"123456","label":"graph_test_2","props":{"time":0, "weight":0.81},"timestamp":1442502000050},
- {"from":1,"to":"zdfdk2384","label":"graph_test_2","props":{"time":1, "weight":1.0},"timestamp":1442502000060},
- {"from":1,"to":"dfjkdjfdk1234","label":"graph_test_2","props":{"time":-2, "weight":0.71},"timestamp":1442502000070}
-]
-'
-
-sleep 2
-
-# select edges
-curl -XPOST localhost:9000/graphs/getEdges -H 'Content-Type: Application/json' -d '
-{
- "srcVertices": [{"serviceName": "s2graph", "columnName": "account_id", "id":1}],
- "steps": [
- {"step": [{"label": "graph_test", "direction": "out", "offset": 0, "limit": 10, "scoring": {"time": 1, "weight": 1}}]}
- ]
-}
-'
-## check for contentions
-
-curl -XPOST localhost:9000/graphs/edges/bulk -H 'Content-Type: text/plain' -d '
-1442502000000 insert edge 2 ab graph_test {"time": -1, "weight": 0.98}
-1442502000001 delete edge 2 ab graph_test {}
-1442502000002 insert edge 2 ab graph_test {"time": -10, "weight": -0.1}
-'
-
-curl -XPOST localhost:9000/graphs/getEdges -H 'Content-Type: Application/json' -d '
-{
- "srcVertices": [{"serviceName": "s2graph", "columnName": "account_id", "id":2}],
- "steps": [
- {"step": [{"label": "graph_test", "direction": "out", "offset": 0, "limit": 10, "scoring": {"time": 1, "weight": 1}}]}
- ]
-}
-'
-
-## Vertex
-curl -XPOST localhost:9000/graphs/createServiceColumn -H 'Content-Type: Application/json' -d '
-{
- "serviceName": "s2graph",
- "columnName": "user_id",
- "columnType": "long",
- "props": [
- {"name": "is_active", "dataType": "boolean", "defaultValue": true},
- {"name": "phone_number", "dataType": "string", "defaultValue": "-"},
- {"name": "nickname", "dataType": "string", "defaultValue": ".."},
- {"name": "activity_score", "dataType": "float", "defaultValue": 0.0},
- {"name": "age", "dataType": "integer", "defaultValue": 0}
- ]
-}
-'
-# add props on Vertex
-curl -XPOST localhost:9000/graphs/addServiceColumnProps/s2graph/user_id -H 'Content-Type: Application/json' -d '
-[
- {"name": "home_address", "defaultValue": "korea", "dataType": "string"}
-]
-'
-
-# insert vertex data
-curl -XPOST localhost:9000/graphs/vertices/insert/s2graph/user_id -H 'Content-Type: Application/json' -d '
-[
- {"id":1,"props":{"is_active":true}, "timestamp":1417616431000},
- {"id":2,"props":{},"timestamp":1417616431000}
-]
-'
-
-
-# select vertices
-curl -XPOST localhost:9000/graphs/getVertices -H 'Content-Type: Application/json' -d '
-[
- {"serviceName": "s2graph", "columnName": "user_id", "ids": [1, 2]}
-]
-'
http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/69c18afd/test.sh
----------------------------------------------------------------------
diff --git a/test.sh b/test.sh
deleted file mode 100644
index eb3a798..0000000
--- a/test.sh
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/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.
-curl -XPOST localhost:9000/graphs/edges/insert -H 'Content-Type: Application/json' -d '
-[
-{"timestamp": 1447493110829, "from": 7007, "to": "700710007abc", "label": "s2graph_label_test_2", "props": {"time": 10}}
-]
-'
-sleep 2
-curl -XPOST localhost:9000/graphs/edges/insert -H 'Content-Type: Application/json' -d '
-[
-{"timestamp": 1447493110831, "from": 7007, "to": "700710007abc", "label": "s2graph_label_test_2", "props": {"time": -10, "weight": 20}}
-]
-'
-sleep 2
-curl -XPOST localhost:9000/graphs/edges/delete -H 'Content-Type: Application/json' -d '
-[
-{"timestamp": 1447493110830, "from": 7007, "to": "700710007abc", "label": "s2graph_label_test_2"}
-]
-'
-sleep 2
-curl -XPOST localhost:9000/graphs/getEdges -H 'Content-Type: Application/json' -d '
-{
- "srcVertices": [
- {
- "serviceName": "s2graph",
- "columnName": "user_id_test",
- "id": 7007
- }
- ],
- "steps": [
- [
- {
- "label": "s2graph_label_test_2",
- "direction": "out",
- "offset": 0,
- "limit": -1,
- "duplicate": "raw"
- }
- ]
- ]
-}
-'
-