Exemplo n.º 1
0
 /**
  * Generates a dot-file for drawing graphical output with the
  * graphviz-application which can be downloaded at http://www.graphviz.org
  * If the graphviz-application is installed and its path is set to the
  * correct value in constants.php we can directly generate any
  * file format graphviz supports, e.g. SVG, PNG
  * Parameters: model to visualize, output format, use prefixes
  *
  * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  * WARNING: Graphviz can be slow with large models.
  * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  *
  * @author   Anton Köstlbacher <*****@*****.**>
  * @param    object  Model
  * @param    string  $format
  * @param    boolean $short_prefix
  * @return   string, binary
  * @access   public
  * @throws   PhpError
  */
 function visualizeGraph(&$model, $format = "input_dot", $short_prefix = TRUE)
 {
     global $graphviz_param;
     $i = 0;
     foreach ($model->triples as $key => $statement) {
         $subject = $statement->getLabelSubject();
         $predicate = $statement->getLabelPredicate();
         $object = $statement->getLabelObject();
         // format subject
         if (!isset($attrib[$subject])) {
             if (is_a($statement->subject(), 'BlankNode')) {
                 $attrib[$subject] = $graphviz_param['BLANKNODE_STYLE'];
             } else {
                 if ($short_prefix == TRUE && RDFUtil::guessPrefix($subject, $model) != FALSE) {
                     $prefix = RDFUtil::guessPrefix($subject, $model);
                     $subject_label = $prefix . ":" . RDFUtil::guessName($subject);
                     $attrib[$subject] = "label=\"" . $subject_label . "\" ";
                     if (!isset($prefix_array[$prefix])) {
                         $prefix_array[$prefix] = RDFUtil::guessNamespace($subject);
                     }
                 }
                 if (GRAPHVIZ_URI == TRUE) {
                     $attrib[$subject] .= "URL=\"" . $subject . "\"";
                 }
             }
         }
         // format predicate
         if ($short_prefix == TRUE && RDFUtil::guessPrefix($predicate, $model) != FALSE) {
             $prefix = RDFUtil::guessPrefix($predicate, $model);
             $predicate_label = "label=\"" . $prefix . ":" . RDFUtil::guessName($predicate) . "\"";
             if (!isset($prefix_array[$prefix])) {
                 $prefix_array[$prefix] = RDFUtil::guessNamespace($predicate);
             }
         } else {
             $predicate_label = "label=\"" . $predicate . "\"";
         }
         if (is_a($statement, 'InfStatement')) {
             $predicate_label .= " " . $graphviz_param['INFERRED_STYLE'];
         } else {
             if (GRAPHVIZ_URI == TRUE) {
                 $predicate_label .= "URL=\"" . $predicate . "\"";
             }
         }
         // format object
         if (!isset($attrib[$object])) {
             if (is_a($statement->object(), 'BlankNode')) {
                 $attrib[$object] = $graphviz_param['BLANKNODE_STYLE'];
             } elseif (is_a($statement->object(), 'Literal')) {
                 $object_label = $object;
                 $object = "literal" . $i;
                 $i++;
                 $attrib[$object] = "label=\"{$object_label}\" " . $graphviz_param['LITERAL_STYLE'];
             } else {
                 if ($short_prefix == TRUE && RDFUtil::guessPrefix($object, $model) != FALSE) {
                     $prefix = RDFUtil::guessPrefix($object, $model);
                     $object_label = $prefix . ":" . RDFUtil::guessName($object);
                     $attrib[$object] = "label=\"" . $object_label . "\" ";
                     if (!isset($prefix_array[$prefix])) {
                         $prefix_array[$prefix] = RDFUtil::guessNamespace($object);
                     }
                 }
                 if (GRAPHVIZ_URI == TRUE) {
                     $attrib[$object] .= "URL=\"" . $object . "\"";
                 }
             }
         }
         // fill graph array
         $graph[] = "\"" . $subject . "\" -> \"" . $object . "\" [" . $predicate_label . "];";
     }
     //generate DOT-file
     $dot = "digraph G { " . $graphviz_param['GRAPH_STYLE'] . "\n edge [" . $graphviz_param['PREDICATE_STYLE'] . "]\n node [" . $graphviz_param['RESOURCE_STYLE'] . "]\n";
     if (isset($attrib)) {
         foreach ($attrib as $key => $value) {
             $dot .= "\"{$key}\" [{$value}];\n";
         }
     }
     if (!isset($graph)) {
         $dot .= "error [shape=box,label=\"No Statements found!\"]";
     } else {
         $dot .= implode("\n", $graph);
     }
     if (GRAPHVIZ_STAT == TRUE) {
         $stat_label = "| " . $model->size() . " Statements drawn";
     }
     if (strstr($graphviz_param['GRAPH_STYLE'], 'rankdir="LR"') === FALSE && strstr($graphviz_param['GRAPH_STYLE'], 'rankdir=LR') === FALSE) {
         $sep1 = "}";
         $sep2 = "";
     } else {
         $sep1 = "";
         $sep2 = "}";
     }
     if ($short_prefix == TRUE && isset($prefix_array)) {
         $struct_label = "{ { Base URI: " . $model->getBaseURI() . " {$sep1} | { { " . implode("|", array_keys($prefix_array)) . " } | { " . implode("|", $prefix_array) . " } } {$stat_label} } {$sep2}";
     } else {
         $struct_label = "{ { Base URI: " . $model->getBaseURI() . "{$sep1} " . $stat_label . " } }";
     }
     $dot .= "\n struct [shape=Mrecord,label=\"{$struct_label}\"," . $graphviz_param['BOX_STYLE'] . "];\n";
     $dot .= " vocabulary [style=invis];\n struct -> vocabulary [style=invis];\n}";
     // if needed call dot.exe
     if ($format != "input_dot" && defined('GRAPHVIZ_PATH') && strstr(GRAPHVIZ_FORMAT, $format) !== FALSE) {
         mt_srand((double) microtime() * 1000000);
         $filename = GRAPHVIZ_TEMP . md5(uniqid(mt_rand())) . ".dot";
         $file_handle = @fopen($filename, 'w');
         if ($file_handle) {
             fwrite($file_handle, $dot);
             fclose($file_handle);
         }
         $dotinput = " -T" . $format . " " . $filename;
         ob_start();
         passthru(GRAPHVIZ_PATH . $dotinput);
         $output = ob_get_contents();
         ob_end_clean();
         unlink($filename);
         echo $output;
         return TRUE;
     } elseif ($format == "input_dot") {
         echo $dot;
         return TRUE;
     } else {
         return FALSE;
     }
 }