75 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Common Lisp
		
	
	
	
	
	
			
		
		
	
	
			75 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")) 
 |