NYCPHP Meetup

NYPHP.org

[nycphp-talk] Graph Data Structures

Jonathan hendler at simmons.edu
Wed Aug 17 15:46:56 EDT 2005


Going off topic:

Thinking of ways to persist the graph :
I've used MySQL a long time and see them as only getting better. But 
their dual license deters me from some uses. - what about SQLite - also 
completely free (LGPL, MIT, or Apache  License I think), small, and fast?
Or dbm functions if I only need to store hashes?

I'll feel silly if I reinvent the work of the RAP RDF datastore. I'll 
have to write tests and a couple implementations so I can know what is 
faster and more efficient.




Kenneth Downs wrote:

>Jonathan,
>
>Glad this helped.
>
>If your graphs get big then you must do this in a database, don't attempt
>it in scripts.
>
>Many people recommend mySQl because it is free, but PostgreSQL is far more
>capable and is also free.
>
>  
>
>>Hi Kenneth,
>>
>>Thanks very much. I like what you have posted!
>>I think I would add keys to the arrays and add one more dimension so
>>that there can be multiple graphs with the same label.
>>
>>$arcs['likes'][]  = array('a','a');
>>$arcs['likes'][]  = array('a','b');
>>$arcs['knows'][]  = array('a','b');
>>
>>$arcs['knows'][]  = array('b','a');
>>$arcs['confusedby'][]  = array('b','a');
>>
>> I can get the functionality I need from this.
>>I wonder how scalable this is. What if there are over 5 million arcs. My
>>traversal algorithms would have to be very efficient.
>>
>>Another package I am looking at for graph manipulation is bundled with
>>the PHP RDF package RAP.
>>
>>http://www.wiwiss.fu-berlin.de/suhl/bizer/rdfapi
>>http://www.wiwiss.fu-berlin.de/suhl/bizer/rdfapi/tutorial/usingNamedGraphs.htm#ng-intro
>>
>>They use quads - where a quad is a labeled graph. In the above data
>>structure, a new graph would just be a new set of arcs. So it looks like
>>nothing is missing from this array based graph.
>>
>>Hmm, or why not
>>
>>$arcs['a']['likes']['b'] = true;
>>$arcs['b']['likes']['b'] = false;
>>or
>>$arcs['b']['likes']['chocolate'][] = '80%';
>>$arcs['b']['likes']['chocolate'][] = 'quite significantly';
>>
>>Then I can have a "triple" with a label and a value.
>>
>>This could be interesting.
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>Kenneth Downs wrote:
>>
>>    
>>
>>>Johathan,
>>>
>>>Have you considered putting the nodes into one array, and the arcs into a
>>>second?
>>>
>>>$nodes = array('a'=>array(..info..),'b'=>array(..info..));
>>>
>>>$arcs = array(array('a','b'),array('b','a'))
>>>
>>>This allows each node's info to be stored only once, and allows you to
>>>then treat the arcs cleanly, allowing or disallowing any combo you may
>>>choose.
>>>
>>>You may have to write a little of your code to walk through things, but
>>>you'll have complete integrity and control.
>>>
>>>
>>>
>>>      
>>>
>>>>I'm trying to formulate a question out of this. If there isn't one here,
>>>>I hope the read is interesting.
>>>>My goal is to create the simplest efficient graph data structures - that
>>>>allow for cycles.
>>>>
>>>>The reason one would want cycles in a graph is the following:
>>>>a->b
>>>>and
>>>>b->a
>>>>(or b->a again with another arc (also known as a hypergraph))
>>>>or
>>>>a->a
>>>>
>>>>where '->' is an arc
>>>>Even if the arcs are labled, the data in 'a' is something I don't want
>>>>to duplicate.
>>>>
>>>>I am using php version 4.3.11
>>>>
>>>>If I try to do this with a simple php array:
>>>>
>>>>   $a = array();
>>>>   $b = array();
>>>>
>>>>   $a['b'] = & $b;
>>>>   $b['a'] = & $a;
>>>>
>>>>   print_r($a);
>>>>
>>>>Array
>>>>(
>>>>   [a] => Array
>>>>       (
>>>>           [b] => Array
>>>>               (
>>>>                   [a] => Array
>>>>*RECURSION*
>>>>               )
>>>>
>>>>       )
>>>>
>>>>)
>>>>
>>>>
>>>>I get this recursion error. Or, perhaps this is not an error at all. But
>>>>I can't seem to use this function:
>>>>
>>>>   function recursive_print($array)
>>>>   {
>>>>       foreach($array as $key => $value)
>>>>       {
>>>>           if (is_array($value))
>>>>           {
>>>>               echo $key .' <hr /> ' .recursive_print($value);
>>>>           }
>>>>           else
>>>>           {
>>>>               echo 'end'.$value;
>>>>           }
>>>>       }
>>>>   }
>>>>
>>>>So I went to the PEAR site -
>>>>http://pear.php.net/package/Structures_Graph
>>>>This pear package doesn't throw any errors but it also seems to balk  -
>>>>although I am not sure the *RECURSION* will affect functionality
>>>>
>>>>
>>>>   include 'Structures/Graph.php';
>>>>   $directedGraph =& new Structures_Graph(true);
>>>>   $nodeOne =& new Structures_Graph_Node();
>>>>   $nodeTwo =& new Structures_Graph_Node();
>>>>
>>>>
>>>>   $directedGraph->addNode(&$nodeOne);
>>>>   $directedGraph->addNode(&$nodeTwo);
>>>>
>>>>
>>>>   $nodeOne->connectTo($nodeTwo);
>>>>   $nodeTwo->connectTo($nodeOne);
>>>>
>>>>
>>>>Inside the code I found a comment about the Zend engine before the data
>>>>structure procedes to iteratively loop through the the nodes to see if
>>>>there are duplicates.
>>>>           /*
>>>>            ZE1 equality operators choke on the recursive cycle
>>>>introduced by the _graph field in the Node object.
>>>>            So, we'll check references the hard way
>>>>           */
>>>>
>>>>Even so, print_r produces many recursion warnings.
>>>>
>>>>Maybe I am just trying to use a hammer for a screwdriver. But can anyone
>>>>offer any insight here?
>>>>
>>>>Thanks,
>>>>
>>>>- Jonathan Hendler
>>>>
>>>>
>>>>
>>>>_______________________________________________
>>>>New York PHP Talk Mailing List
>>>>AMP Technology
>>>>Supporting Apache, MySQL and PHP
>>>>http://lists.nyphp.org/mailman/listinfo/talk
>>>>http://www.nyphp.org
>>>>
>>>>
>>>>        
>>>>
>>>
>>>
>>>      
>>>
>>_______________________________________________
>>New York PHP Talk Mailing List
>>AMP Technology
>>Supporting Apache, MySQL and PHP
>>http://lists.nyphp.org/mailman/listinfo/talk
>>http://www.nyphp.org
>>
>>    
>>
>
>
>  
>




More information about the talk mailing list