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")) 
 |