memgraph/customers/elliott/README_public.md
Marin Tomic cfd01185d2 create public readme for elliott
Reviewers: buda

Reviewed By: buda

Subscribers: pullbot

Differential Revision: https://phabricator.memgraph.io/D936
2017-10-27 15:34:27 +02:00

1.8 KiB

We tried generating a few sample graphs from the description given at the in-person meetings. Then, we tried writing queries that would solve the problem of updating nodes when a leaf value changes, assuming all the internal nodes compute only the sum function.

We started by creating an index on id property to improve initial lookup performance:

CREATE INDEX ON :Leaf(id)

Afther that, we set values of all leafs to 1:

MATCH (u:Leaf) SET u.value = 1

We then initialized the values of all other nodes in the graph:

MATCH (u) WHERE NOT u:Leaf SET u.value = 0

MATCH (u) WITH u
ORDER BY u.topological_index DESC
MATCH (u)-->(v) SET u.value = u.value + v.value

Leaf value change and update of affected values in the graph can be done using three queries. To change the value of a leaf:

MATCH (u:Leaf {id: "18"}) SET u.value = 10

Then we had to reset all the affected nodes to the neutral element:

MATCH (u:Leaf {id: "18"})<-[* bfs]-(v)
WHERE NOT v:Leaf SET v.value = 0

Finally, we recalculated their values in topological order:

MATCH (u:Leaf {id: "18"})<-[* bfs]-(v)
WITH v ORDER BY v.topological_index DESC
MATCH (v)-->(w) SET v.value = v.value + w.value

There are a few assumptions necessary for the approach above to work.

  • We are able to maintain topological order of vertices during graph structure changes.

  • It is possible to accumulate the value of the function. Formally:

    f(x_1, x_2, ..., x_n) = g(...(g(g(x_1, x_2), x_3), ...), x_n)
  • There is a neutral element for the operation. However, this assumption can be dropped by introducing an artificial neutral element.

Above assumptions could be changed, relaxed or dropped, depending on the specifics of the use case.

Number of operations required is proportional to the sum of degrees of affected nodes.