[ 
https://issues.apache.org/jira/browse/S2GRAPH-229?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16529452#comment-16529452
 ] 

ASF GitHub Bot commented on S2GRAPH-229:
----------------------------------------

GitHub user daewon opened a pull request:

    https://github.com/apache/incubator-s2graph/pull/178

    [S2GRAPH-229] 'Step' abstraction for combinable queries

    # Step interface abstraction for combinable queries.
    
    I have created an interface for each step to enable query 
combinations(using Observable[T])
    
    ```scala
    trait RxStep[-A, +B] extends (A => Observable[B])
    ```
    
    RxStep simply inherits the function interface (A => B)
    This makes it possible to naturally connect with the transform functions 
provided by Observable (map, flatMap ..)
    
    I have implemented a simple query in the `GraphTest.scala` file for the 
step utilization test.
    
    Here is the example code.
    
    'VertexFetchStep' and 'EdgeFetchStep' each implement RxStep trait.
    In addition, since GraphElement => Boolean is implemented in 'Where', it 
naturally integrates with Observable interface.
    
    ```scala
    
    val v1 = VertexFetchStep(graph)
    
    val qpIn = QueryParam(labelName = testLabelName, direction = "in")
    val qpOut = QueryParam(labelName = testLabelName, direction = "out")
    
    val e1 = EdgeFetchStep(graph, qpIn) 
    val e2 = EdgeFetchStep(graph, qpOut)
    
    val where = Where("_to = 20").get
    
    val q =
      v1.apply(vertices) 
        .flatMap(e1) 
        .filter(where.filter)
        .map(_.tgtForVertex) 
        .flatMap(v => e1.apply(v) ++ e2.apply(v)) 
    
    val res = q.toBlocking.toList
    ```

You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/daewon/incubator-s2graph S2GRAPH-229

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/incubator-s2graph/pull/178.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #178
    
----
commit 6b088944b877b25775ac424658ad9b6472203082
Author: daewon <daewon@...>
Date:   2018-07-02T06:28:17Z

    make step works

----


> 'Step' abstraction for combinable queries
> -----------------------------------------
>
>                 Key: S2GRAPH-229
>                 URL: https://issues.apache.org/jira/browse/S2GRAPH-229
>             Project: S2Graph
>          Issue Type: Task
>          Components: s2core
>            Reporter: Daewon Jeong
>            Priority: Minor
>
> Graph Query is a combination of queries of each step.
> For example, 
>   1. you can take a vertex, 
>    2. then bring the edge back with that vertex, 
>    3. get the vertex from the edge, 
>    4. and bring the edge from that vertex.
> The query that is being provided now is not tied to each of the above steps, 
> but is tightly coupled throughout the query.
> Since functions such as filter, transform(group_by, merge), and 
> postprocess(conversion to json/xml) are tightly coupled to the entire query 
> function, 
>  it is difficult to test each function separately. 
> To solve this problem, 
>    1. each step is created as an independent function and 
>    2. the function of assembling each step is separated separately.
> Each step is separated as above, the following functions can be implemented 
> without additional code.
>   ex) In the case of deleteAll, fetch each edge and make delete request 
> again. 
> Implement Prototyping
>     1. For query efficiency, each step implements the function to return 
> Observable.
>     2. Use Observable(RxScala)'s flatMap to connect each step.
> Below is the pseudocode.
> 1. Bringing the edges from the vertex, collect only edges whose score is 0.5 
> and serialize them to Json
> {code:java}
>  val vs: Step[Int, S2VertexLike] = VertexStep()
>  val es: Step[S2VertexLike, S2EdgeLike] = EdgeStep(dir = "OUT")
>  val js: Step[S2EdgeLike, Json] = JsonSerializeStep(limit: 10)
> val q: Observable[Json] = 
>  vs.apply(1) 
>  .flatMap(es)
>  .filter(_.property("score") > 0.5)
>  .flatMap(js)
> {code}
> What to think about.
>     1. The ability to link each step is subject to Observable.
>  - This makes it impossible to draw the connection graph of the Step instead 
> of making the function easier to implement.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to