76 lines
1.8 KiB
Common Lisp
76 lines
1.8 KiB
Common Lisp
|
(in-package #:metabang.gsn)
|
||
|
|
||
|
#|
|
||
|
Need to account for different kinds of links
|
||
|
in gsn-nodes-from-json, need to return pairs of node and attributes
|
||
|
|
||
|
hash-table for nodes to prevent duplicates
|
||
|
queue or stack for nodes to expand
|
||
|
hash-table for links (triples of A link B?) to handle duplicates
|
||
|
|#
|
||
|
|
||
|
(defgeneric expand-node (context node)
|
||
|
)
|
||
|
|
||
|
(defgeneric find-neighbors (context node)
|
||
|
)
|
||
|
|
||
|
(defgeneric expand-node-p (context node)
|
||
|
)
|
||
|
|
||
|
(defgeneric add-node (context node)
|
||
|
)
|
||
|
|
||
|
(defgeneric add-link (context node neighbor direction)
|
||
|
)
|
||
|
|
||
|
(defgeneric update-node-data (context node data)
|
||
|
)
|
||
|
|
||
|
(defclass abstract-context ()
|
||
|
())
|
||
|
|
||
|
(defclass gsn-context (abstract-context)
|
||
|
())
|
||
|
|
||
|
(defparameter +gsn-root+ "http://socialgraph.apis.google.com/")
|
||
|
|
||
|
(defmethod expand-node ((context abstract-context) node)
|
||
|
(bind (((to from) (find-neighbors context node)))
|
||
|
(dolist (neighbor to)
|
||
|
(add-node context neighbor)
|
||
|
(add-link context node neighbor :to))
|
||
|
(dolist (neighbor from)
|
||
|
(add-node context neighbor)
|
||
|
(add-link context node neighbor :from))))
|
||
|
|
||
|
|
||
|
|
||
|
(defmethod find-neighbors ((context gsn-context) node)
|
||
|
(bind (((result headers stream)
|
||
|
(http-get
|
||
|
(format nil "~alookup?edo=1&edi=1&pretty=1&q=~a"
|
||
|
+gsn-root+ node)))
|
||
|
json)
|
||
|
(unwind-protect
|
||
|
(setf json (json:decode-json stream))
|
||
|
(close strea))
|
||
|
(update-node-data context node json)
|
||
|
(list (gsn-nodes-from-json json :to)
|
||
|
(gsn-nodes-from-json json :from))))
|
||
|
|
||
|
(gsn-nodes-from-json x :from)
|
||
|
|
||
|
(defun gsn-test (who)
|
||
|
(destructuring-bind (result headers stream)
|
||
|
(http-get
|
||
|
(format nil "http://socialgraph.apis.google.com/lookup?edo=1&edi=1&pretty=1&q=~a" who))
|
||
|
(declare (ignore result headers))
|
||
|
(json:decode-json stream)))
|
||
|
|
||
|
(assoc :nodes_referenced
|
||
|
(assoc :nodes (gsn-test "TWITTER.COM/GWKING") :key #'first))
|
||
|
|
||
|
|
||
|
(setf x (gsn-test "TWITTER.COM/GWKING"))
|