How to calculate rowspan and colspan using graph traversal?

70 views
Skip to first unread message

Frank Russell

unread,
Mar 15, 2017, 11:11:53 PM3/15/17
to ArangoDB
I want to save html table header as graph. My question is

  1. Is it possible to calculate rowspan and colspan using only AQL? For example, using edge attribute.
  2. How to do numbering for final result? For example, {"index": i + 1}

Attachment:
  • result.json : The final result json should look like.
  • columns.json: All columns (Nodes)
  • table1-columns.json: Table1 columns (Edges)

table1: 
Graph({edges: "table1-columns", fromCollections: "columns", toCollections: "columns"})



My pseudo query:
LET index = 0
FOR v
,e,p IN 1..10 OUTBOUND "columns/0"
GRAPH
"table1"
 
/* FILTER p.vertices[2].id != 2 */
  index
= index + 1  
SORT LENGTH
(p.vertices)-1,v.id
RETURN
{
 
"index": index,
 
"id": v.id,
 
"title": v.title,
 
"row": LENGTH(p.vertices)-1,
 
"root": p.vertices[1].id,
 
"rowspan": rowspan,
 
"colspan": colspan
}



Thank you
columns.json
result.json
table.html
table1-columns.json

Jan

unread,
Mar 16, 2017, 4:35:00 AM3/16/17
to ArangoDB
Hi,

one possible and rather generic solution is to run the actual query in a subquery, calculate its number of rows and then return each row from it augmented with rowspan and colspan.

Example:

/* this is a template for an empty row */
/* it needs to contain all the attributes to be returned from the actual query, plus default values should an attribute not be present */
LET empty = { _id: null, _key: null, name: null }

LET keepColumns = ATTRIBUTES(empty)
LET colspan = LENGTH(keepColumns) + 3   /* LENGTH([ "row", "colspan", "rowspan" ]) == 3 */

LET result = (
  /* actual query goes here, e.g. FOR doc IN collection RETURN doc */
)

LET rowspan = LENGTH(result) /* number of rows in result */

/* iterate over result and emit it */
FOR i IN 1..rowspan LET row = result[i - 1]
  RETURN MERGE(empty, KEEP(row, keepColumns), { row: i, rowspan, colspan })


Best regards
Jan

Frank Russell

unread,
Mar 16, 2017, 12:36:06 PM3/16/17
to ArangoDB
Thank you, Jan. Your answer is work, but my question may not clear.

1. How to find max depth of the graph
LET maxLevel = MAX_DEPTH(table1)

2. For every node visit,

If current node has no children then
LET currentLevel =  LENGTH(path.vertices)
LET rowspan = COUNT_CHILDREN(node) == 0 ? maxLevel - currentLevel : 0

If current node has children then
LET colspan  = COUNT_CHILDREN(node) > 0 ? COUNT_LEAF_NODE(node) : 0


Example
| A |   |   |   |   |   |
|---|---|---|---|---|---|
| B |   |   |   | C |   |
| D |   | E |   | F | G |
| H | I | J | K | L |   |


LEAF_NODE(A) = [H, I, J, K, L, G] =  6
LEAF_NODE(B) = [H, I, J, K, L]      =  4
LEAF_NODE(C) = [L, G]                 =  2

  1. Can AQL Count leaf nodes?
  2. Can AQL find max depth of graph?


เมื่อ วันพฤหัสบดีที่ 16 มีนาคม ค.ศ. 2017 15 นาฬิกา 35 นาที 00 วินาที UTC+7, Jan เขียนว่า:
Reply all
Reply to author
Forward
0 new messages