API functions

This is a random collection of relationship APIs we sghhould, could, might or might not include.

  • set_relation($leftid, $rightid, $relationship, $weight = 0) //make a relationship between two nodes
  • get_relation($id, $relationship = “”) //get any related nodes, restricted by type of relationship; returns an array of related nodes

And from http://drupal.pastebin.com/408221 some great SQL ideas by Vlado

==========================================

nodes with the same terms, ordered by number of the related terms

many to many relations defined by terms

can be used to model different labeled sets

==========================================

SELECT tn.nid, n.title, r.teaser, count(tn.tid) AS metric FROM {node} AS n LEFT JOIN {termnode} AS tn ON tn.nid=n.nid INNER JOIN {noderevisions} AS r ON r.vid = n.vid WHERE tn.tid IN (SELECT tid FROM term_node WHERE nid=%d) AND tn.nid != %d GROUP BY tn.nid ORDER BY metric DESC LIMIT %d;

=========================================

Tree structures of a relationship domain

=========================================

All immediate children of a node - in case of tree structures

directly - one->many

with implied order, by walking the tree

SELECT n.nid FROM node AS n LEFT JOIN tree AS t ON n.nid=t.nid WHERE t.lft > $node->left AND t.rgt < $node->right AND t.lvl = $t->lvl+1 ORDER BY t.lft;

All children of a node (trees)

order by distance - first level, then left

SELECT n.nid FROM node AS n LEFT JOIN tree AS t ON n.nid=t.nid WHERE t.lft > $node->left AND t.rgt < $node->right ORDER BY t.lvl , t.lft;

The immediate parent (first node up the tree)

SELECT n.nid FROM node AS n LEFT JOIN tree AS t ON n.nid=t.nid WHERE t.lft < $node->left AND t.rgt > $node->right ORDER BY t.lft DESC LIMIT 1;

All children of a node (trees)

order by distance from the node

SELECT n.nid FROM node AS n LEFT JOIN tree AS t ON n.nid=t.nid WHERE t.lft < $node->left AND t.rgt > $node->right ORDER BY t.lft DESC;

All children of a node (trees)

order from the root

SELECT n.nid FROM node AS n LEFT JOIN tree AS t ON n.nid=t.nid WHERE t.lft < $node->left AND t.rgt > $node->right ORDER BY t.lft;

====================================================

Graph relations domainstructures

Using adjacency lists graph (nid,next_id)

to get a “deeper” or indirect relations you need to iterate through the

results either in SQL or from your program code

====================================================

SELECT n.nid FROM node AS n LEFT JOIN graph AS g ON n.nid=g.next_id WHERE g.nid = $node->nid;

ordered by weight

graph (nid,next_id,weight)

SELECT n.nid FROM node AS n LEFT JOIN graph AS g ON n.nid=g.next_id WHERE g.nid = $node->nid ORDER BY g.weight;

ordered by weight

# SELECT n.nid FROM node AS n LEFT JOIN graph AS g ON n.nid=g.next_id WHERE g.nid = $node->nid;