Source for file RdfUtil.php

Documentation is available at RdfUtil.php

  1. <?php
  2.  
  3. // ----------------------------------------------------------------------------------
  4. // Class: RDFUtil
  5. // ----------------------------------------------------------------------------------
  6.  
  7. /**
  8. * Useful utility methods.
  9. * Static class.
  10. *
  11. @version  $Id: fsource_utility__utilRdfUtil.php.html 443 2007-06-01 16:25:38Z cax $
  12. @author Chris Bizer <chris@bizer.de>, Daniel Westphal <dawe@gmx.de>
  13. @author   Anton Köstlbacher <anton1@koestlbacher.de>
  14. @package utility
  15. @access    public
  16. ***/
  17. class RDFUtil extends Object {
  18.  
  19.     /**
  20.     * Extracts the namespace prefix out of a URI.
  21.     *
  22.     * @param    String    $uri 
  23.     * @return    string 
  24.     * @access    public
  25.     */
  26.     function guessNamespace($uri{
  27.         $l RDFUtil::getNamespaceEnd($uri);
  28.         return $l substr($uri ,0$l"";
  29.     }
  30.  
  31.     /**
  32.     * Delivers the name out of the URI (without the namespace prefix).
  33.     *
  34.     * @param    String    $uri 
  35.     * @return    string 
  36.     * @access    public
  37.     */
  38.     function guessName($uri{
  39.         return substr($uri,RDFUtil::getNamespaceEnd($uri));
  40.     }
  41.  
  42.     /**
  43.     * Extracts the namespace prefix out of the URI of a Resource.
  44.     *
  45.     * @param    Object Resource    $resource
  46.     * @return    string 
  47.     * @access    public
  48.     */
  49.     function getNamespace($resource{
  50.         return RDFUtil::guessNamespace($resource->getURI());
  51.     }
  52.  
  53.     /**
  54.     * Delivers the Localname (without the namespace prefix) out of the URI of a Resource.
  55.     *
  56.     * @param    Object Resource    $resource
  57.     * @return    string 
  58.     * @access    public
  59.     */
  60.     function getLocalName($resource{
  61.         return RDFUtil::guessName($resource->getURI());
  62.     }
  63.  
  64.     /**
  65.     * Position of the namespace end
  66.     * Method looks for # : and /
  67.     * @param    String    $uri 
  68.     * @access    private
  69.     */
  70.     function getNamespaceEnd($uri{
  71.         $l strlen($uri)-1;
  72.         do {
  73.             $c substr($uri$l1);
  74.             if($c == '#' || $c == ':' || $c == '/')
  75.             break;
  76.             $l--;
  77.         while ($l >= 0);
  78.         $l++;
  79.         return $l;
  80.     }
  81.  
  82.         /**
  83.     * Short Prefix for known Namespaces by given URI
  84.     * @param    String    $uri 
  85.     * @access    public
  86.     */
  87.     function getPrefix($uri{
  88.             switch (RDFUtil::guessNamespace($uri))
  89.         {
  90.                 case RDF_NAMESPACE_URI:
  91.                 $prefix RDF_NAMESPACE_PREFIX;
  92.                 break;
  93.  
  94.                 case RDF_SCHEMA_URI:
  95.                 $short_p RDF_SCHEMA_PREFIX;
  96.                 break;
  97.  
  98.                 case OWL_URI:
  99.                 $short_p OWL_PREFIX;
  100.                 break;
  101.  
  102.                 default:
  103.                 $short_p $statement->getLabelPredicate();
  104.             }
  105.             return $short_p;
  106.     }
  107.  
  108.  
  109.     /**
  110.     * Tests if the URI of a resource belongs to the RDF syntax/model namespace.
  111.     *
  112.     * @param    Object Resource    $resource
  113.     * @return    boolean 
  114.     * @access    public
  115.     */
  116.     function isRDF($resource{
  117.         return ($resource != NULL && RDFUtil::getNamespace($resource== RDF_NAMESPACE_URI);
  118.     }
  119.  
  120.     /**
  121.     * Escapes < > and &
  122.     *
  123.     * @param    String    $textValue 
  124.     * @return    String 
  125.     * @access    public
  126.     */
  127.     function escapeValue($textValue{
  128.  
  129.         $textValue str_replace('<''&lt;'$textValue);
  130.         $textValue str_replace('>''&gt;'$textValue);
  131.         $textValue str_replace('&''&amp;'$textValue);
  132.  
  133.         return $textValue;
  134.     }
  135.  
  136.     /**
  137.     * Converts an ordinal RDF resource to an integer.
  138.     * e.g. Resource(RDF:_1) => 1
  139.     *
  140.     * @param    object Resource    $resource 
  141.     * @return    Integer 
  142.     * @access    public
  143.     */
  144.     function getOrd($resource)  {
  145.         if($resource == NULL || !is_a($resource'Resource'|| !RDFUtil::isRDF($resource))
  146.         return -1;
  147.         $name RDFUtil::getLocalName($resource);
  148.         echo substr($name1).' '.RDFUtil::getLocalName($resource);
  149.         $n substr($name1);
  150.         //noch rein : chekcen ob $n Nummer ist !!!!!!!!!!!!!!!!!!!!!!if($n)
  151.         return $n;
  152.         return -1;
  153.     }
  154.  
  155.     /**
  156.     * Creates ordinal RDF resource out of an integer.
  157.     *
  158.     * @param    Integer    $num 
  159.     * @return    object Resource 
  160.     * @access    public
  161.     */
  162.     function createOrd($num)  {
  163.         return new Resource(RDF_NAMESPACE_URI '_' $num);
  164.     }
  165.  
  166.     /**
  167.     * Prints a MemModel as HTML table.
  168.     * You can change the colors in the configuration file.
  169.     *
  170.     * @param    object MemModel     &$model 
  171.     * @access    public
  172.     */
  173.     function writeHTMLTable(&$model)  {
  174.         $nms $model->getParsedNamespaces();
  175.         $names '';
  176.         $pre '';
  177.  
  178.  
  179.         echo '<table border="1" cellpadding="3" cellspacing="0" width="100%">' LINEFEED;
  180.         echo INDENTATION '<tr bgcolor="' HTML_TABLE_HEADER_COLOR '">' LINEFEED INDENTATION INDENTATION '<td td width="68%" colspan="3">';
  181.         echo '<p><b>Base URI:</b> ' $model->getBaseURI('</p></td>' LINEFEED;
  182.         echo INDENTATION INDENTATION '<td width="32%"><p><b>Size:</b> ' $model->size('</p></td>' LINEFEED INDENTATION '</tr>';
  183.  
  184.         echo '<tr><td><b>Prefix:</b>'.'<br/></td><td colspan="3"><b>Namespace:</b>'.'<br/></td></tr>';
  185.         $i=0;
  186.         if($nms != false){
  187.             foreach($nms as $namespace => $prefix){
  188.                 if($i==0){
  189.                     $col HTML_TABLE_NS_ROW_COLOR0;
  190.                 }else{
  191.                     $col HTML_TABLE_NS_ROW_COLOR1;
  192.                 }
  193.                 echo '<tr bgcolor="'.$col.'"><td>'.$prefix.'</td><td colspan="3">'.$namespace.'</td></tr>';
  194.                 $i++;
  195.                 $i%=2;
  196.             }
  197.         }else{
  198.             echo '<tr><td>-</td><td colspan="3">-</td></tr>';
  199.         }
  200.  
  201.  
  202.  
  203.  
  204.         echo INDENTATION '<tr bgcolor="' HTML_TABLE_HEADER_COLOR '">' LINEFEED INDENTATION INDENTATION '<td width="4%"><p align=center><b>No.</b></p></td>' LINEFEED INDENTATION INDENTATION '<td width="32%"><p><b>Subject</b></p></td>' LINEFEED INDENTATION INDENTATION '<td width="32%"><p><b>Predicate</b></p></td>' LINEFEED INDENTATION INDENTATION '<td width="32%"><p><b>Object</b></p></td>' LINEFEED INDENTATION '</tr>' LINEFEED;
  205.  
  206.         $i 1;
  207.         foreach($model->triples as $key => $statement{
  208.             $infered='';
  209.             if (is_a($statement,'InfStatement')) $infered='<small>(infered)</small>';
  210.             echo INDENTATION '<tr valign="top">' LINEFEED INDENTATION INDENTATION '<td><p align=center>' $i '.<BR>'.$infered.'</p></td>' LINEFEED;
  211.             // subject
  212.             echo INDENTATION INDENTATION '<td bgcolor="';
  213.             echo RDFUtil::chooseColor($statement->getSubject());
  214.             echo '">';
  215.             echo '<p>' .  RDFUtil::getNodeTypeName($statement->getSubject());
  216.             if(is_a($statement->subj,'Resource')){
  217.                 $ns $statement->subj->getNamespace();
  218.                 if(isset($nms[$ns])){
  219.                     echo $nms[$ns].':'.RDFUtil::getLocalName($statement->subj);
  220.                 }else{
  221.                     echo $statement->subj->getLabel();
  222.                 }
  223.             }
  224.             echo '</p></td>' .  LINEFEED;
  225.             // predicate
  226.             echo INDENTATION INDENTATION '<td bgcolor="';
  227.             echo RDFUtil::chooseColor($statement->getPredicate());
  228.             echo '">';
  229.             echo '<p>' RDFUtil::getNodeTypeName($statement->getPredicate());
  230.             if(is_a($statement->pred,'Resource')){
  231.                 $ns $statement->pred->getNamespace();
  232.                 if(isset($nms[$ns])){
  233.                     echo $nms[$ns].':'.RDFUtil::getLocalName($statement->pred);
  234.                 }else{
  235.                     echo $statement->pred->getLabel();
  236.                 }
  237.             }
  238.             echo '</p></td>' .  LINEFEED;
  239.             // object
  240.             echo INDENTATION INDENTATION '<td bgcolor="';
  241.             echo RDFUtil::chooseColor($statement->getObject());
  242.             echo '">';
  243.             echo '<p>';
  244.             if (is_a($statement->getObject()'Literal')) {
  245.                 if ($statement->obj->getLanguage(!= null{
  246.                     $lang ' <b>(xml:lang="' $statement->obj->getLanguage('") </b> ';
  247.                 ELSE $lang '';
  248.                 if ($statement->obj->getDatatype(!= null{
  249.                     $dtype ' <b>(rdf:datatype="' $statement->obj->getDatatype('") </b> ';
  250.                 ELSE $dtype '';
  251.             else {
  252.                 $lang '';
  253.                 $dtype '';
  254.             }
  255.             $label $statement->obj->getLabel();
  256.             if(is_a($statement->obj,'Resource')){
  257.                 $ns $statement->obj->getNamespace();
  258.                 if(isset($nms[$ns])){
  259.                     $label $nms[$ns].':'.RDFUtil::getLocalName($statement->obj);
  260.                 }else{
  261.                     $label $statement->obj->getLabel();
  262.                 }
  263.             }
  264.  
  265.             echo  RDFUtil::getNodeTypeName($statement->getObject())
  266.             .nl2br(htmlspecialchars($label)) $lang $dtype;
  267.  
  268.             echo '</p></td>' LINEFEED;
  269.             echo INDENTATION '</tr>' LINEFEED;
  270.             $i++;
  271.         }
  272.         echo '</table>' LINEFEED;
  273.     }
  274.  
  275.     /**
  276.     * Chooses a node color.
  277.     * Used by RDFUtil::writeHTMLTable()
  278.     *
  279.     * @param    object Node    $node 
  280.     * @return    object Resource 
  281.     * @access    private
  282.     */
  283.     function chooseColor($node)  {
  284.         if (is_a($node'BlankNode'))
  285.         return HTML_TABLE_BNODE_COLOR;
  286.         elseif (is_a($node'Literal'))
  287.         return HTML_TABLE_LITERAL_COLOR;
  288.         else {
  289.             if (RDFUtil::getNamespace($node== RDF_NAMESPACE_URI ||
  290.             RDFUtil::getNamespace($node== RDF_SCHEMA_URI ||
  291.             RDFUtil::getNamespace($node== OWL_URI
  292.             )
  293.  
  294.             return HTML_TABLE_RDF_NS_COLOR;
  295.         }
  296.         return HTML_TABLE_RESOURCE_COLOR;
  297.  
  298.     }
  299.  
  300.     /**
  301.     * Get Node Type.
  302.     * Used by RDFUtil::writeHTMLTable()
  303.     *
  304.     * @param    object Node    $node 
  305.     * @return    object Resource 
  306.     * @access    private
  307.     */
  308.     function getNodeTypeName($node)  {
  309.         if (is_a($node"BlankNode"))
  310.         return 'Blank Node: ';
  311.         elseif (is_a($node'Literal'))
  312.         return 'Literal: ';
  313.         else {
  314.             if (RDFUtil::getNamespace($node== RDF_NAMESPACE_URI ||
  315.             RDFUtil::getNamespace($node== RDF_SCHEMA_URI ||
  316.             RDFUtil::getNamespace($node== OWL_URI)
  317.             return 'RDF Node: ';
  318.         }
  319.         return 'Resource: ';
  320.  
  321.     }
  322.  
  323.  
  324.  /**
  325.  * Short Prefix for known and/or parsed Namespaces by given URI and Model
  326.  * Uses $default_prefixes defined in constants.php and getParsedNamespaces()
  327.  * Returns FALSE if no matching prefix is found
  328.  *
  329.  * @author   Anton Köstlbacher <anton1@koestlbacher.de>
  330.  * @param    string  $uri 
  331.  * @param    object $model 
  332.  * @return   string, boolean
  333.  * @access   public
  334.  * @throws   PhpError
  335.  */
  336.  
  337.  function guessPrefix($uri&$model)
  338.  {
  339.      global $default_prefixes;
  340.      $namespace RDFUtil::guessNamespace($uri);
  341.      $par_nms   $model->getParsedNamespaces();
  342.      if (isset($par_nms[$namespace]))
  343.      {
  344.          $prefix $par_nms[$namespace];
  345.      }
  346.      else
  347.      {
  348.          $prefix array_search($namespace$default_prefixes);
  349.      }
  350.      if($prefix !== false)
  351.      {
  352.         return $prefix;
  353.      }
  354.      else
  355.      {
  356.         return false;
  357.      }
  358.  }
  359.  
  360.  
  361.  /**
  362.  * Generates a dot-file for drawing graphical output with the
  363.  * graphviz-application which can be downloaded at http://www.graphviz.org
  364.  * If the graphviz-application is installed and its path is set to the
  365.  * correct value in constants.php we can directly generate any
  366.  * file format graphviz supports, e.g. SVG, PNG
  367.  * Parameters: model to visualize, output format, use prefixes
  368.  *
  369.  * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  370.  * WARNING: Graphviz can be slow with large models.
  371.  * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  372.  *
  373.  * @author   Anton Köstlbacher <anton1@koestlbacher.de>
  374.  * @param    object  Model 
  375.  * @param    string  $format 
  376.  * @param    boolean $short_prefix 
  377.  * @return   string, binary
  378.  * @access   public
  379.  * @throws   PhpError
  380.  */
  381.  
  382.  function visualizeGraph(&$model$format "input_dot"$short_prefix TRUE)
  383.  {
  384.      global $graphviz_param;
  385.      $i 0;
  386.  
  387.      foreach ($model->triples as $key => $statement)
  388.      {
  389.          $subject   $statement->getLabelSubject();
  390.          $predicate $statement->getLabelPredicate();
  391.          $object    $statement->getLabelObject();
  392.  
  393.          // format subject
  394.          if (!isset($attrib[$subject]))
  395.          {
  396.              if (is_a($statement->subject(),'BlankNode'))
  397.              {
  398.                  $attrib[$subject$graphviz_param['BLANKNODE_STYLE'];
  399.              }
  400.              else
  401.              {
  402.                  if ($short_prefix == TRUE && RDFUtil::guessPrefix($subject$model!= FALSE)
  403.                  {
  404.                      $prefix RDFUtil::guessPrefix($subject$model);
  405.                      $subject_label $prefix.":".RDFUtil::guessName($subject);
  406.                      $attrib[$subject"label=\"".$subject_label."\" ";
  407.                      if(!isset($prefix_array[$prefix]))
  408.                      {
  409.                          $prefix_array[$prefixRDFUtil::guessNamespace($subject);
  410.                      }
  411.                  }
  412.                  if (GRAPHVIZ_URI == TRUE)
  413.                  {
  414.                      $attrib[$subject.= "URL=\"".$subject."\"";
  415.                  }
  416.              }
  417.          }
  418.  
  419.          // format predicate
  420.          if ($short_prefix == TRUE && RDFUtil::guessPrefix($predicate$model!= FALSE)
  421.          {
  422.              $prefix RDFUtil::guessPrefix($predicate$model);
  423.              $predicate_label "label=\"".$prefix.":".RDFUtil::guessName($predicate)."\"";
  424.              if(!isset($prefix_array[$prefix]))
  425.              {
  426.                  $prefix_array[$prefixRDFUtil::guessNamespace($predicate);
  427.              }
  428.          }
  429.          else
  430.          {
  431.              $predicate_label "label=\"".$predicate."\"";
  432.          }
  433.  
  434.     if (is_a($statement,'InfStatement'))
  435.          {
  436.              $predicate_label .= " ".$graphviz_param['INFERRED_STYLE'];
  437.          }
  438.          else
  439.          {
  440.              if (GRAPHVIZ_URI == TRUE)
  441.              {
  442.                  $predicate_label .= "URL=\"".$predicate."\"";
  443.              }
  444.          }
  445.  
  446.          // format object
  447.          if (!isset($attrib[$object]))
  448.          {
  449.              if (is_a($statement->object(),'BlankNode'))
  450.              {
  451.                  $attrib[$object$graphviz_param['BLANKNODE_STYLE'];
  452.              }
  453.              elseif (is_a($statement->object(),'Literal'))
  454.              {
  455.                  $object_label $object;
  456.                  $object "literal".$i;
  457.                  $i++;
  458.                  $attrib[$object"label=\"$object_label\" ".$graphviz_param['LITERAL_STYLE'];
  459.              }
  460.              else
  461.              {
  462.                  if ($short_prefix == TRUE && RDFUtil::guessPrefix($object$model!= FALSE)
  463.                  {
  464.                      $prefix RDFUtil::guessPrefix($object$model);
  465.                      $object_label $prefix.":".RDFUtil::guessName($object);
  466.                      $attrib[$object"label=\"".$object_label."\" ";
  467.                      if(!isset($prefix_array[$prefix]))
  468.                      {
  469.                          $prefix_array[$prefixRDFUtil::guessNamespace($object);
  470.                      }
  471.                  }
  472.                  if (GRAPHVIZ_URI == TRUE)
  473.                  {
  474.                      $attrib[$object.= "URL=\"".$object."\"";
  475.                  }
  476.              }
  477.          }
  478.  
  479.          // fill graph array
  480.          $graph["\"".$subject."\" -> \"".$object."\" [".$predicate_label."];";
  481.      }
  482.  
  483.      //generate DOT-file
  484.      $dot "digraph G { ".$graphviz_param['GRAPH_STYLE']."\n edge [".$graphviz_param['PREDICATE_STYLE']."]\n node [".$graphviz_param['RESOURCE_STYLE']."]\n";
  485.      if (isset($attrib))
  486.      {
  487.          foreach ($attrib AS $key => $value)
  488.          {
  489.              $dot .= "\"$key\" [$value];\n";
  490.          }
  491.      }
  492.      if (!isset($graph))
  493.      {
  494.          $dot .= "error [shape=box,label=\"No Statements found!\"]";
  495.      }
  496.      else
  497.      {
  498.          $dot .= implode("\n"$graph);
  499.      }
  500.  
  501.  
  502.      if (GRAPHVIZ_STAT == TRUE)
  503.      {
  504.          $stat_label "| ".$model->size()." Statements drawn";
  505.      }
  506.      if ((strstr($graphviz_param['GRAPH_STYLE']'rankdir="LR"'=== FALSE&& (strstr($graphviz_param['GRAPH_STYLE']'rankdir=LR'=== FALSE))
  507.      {
  508.          $sep1 "}";
  509.          $sep2 "";
  510.      }
  511.      else
  512.      {
  513.          $sep1 "";
  514.          $sep2 "}";
  515.      }
  516.  
  517.      if ($short_prefix == TRUE && isset($prefix_array))
  518.      {
  519.          $struct_label "{ { Base URI: ".$model->getBaseURI()." $sep1 | { { ".implode("|"array_keys($prefix_array))." } | { ".implode("|"$prefix_array)." } } $stat_label } $sep2";
  520.      }
  521.      else
  522.      {
  523.          $struct_label "{ { Base URI: ".$model->getBaseURI()."$sep1 ".$stat_label." } }";
  524.      }
  525.  
  526.      $dot .= "\n struct [shape=Mrecord,label=\"$struct_label\",".$graphviz_param['BOX_STYLE']."];\n";
  527.      $dot .= " vocabulary [style=invis];\n struct -> vocabulary [style=invis];\n}";
  528.  
  529.      // if needed call dot.exe
  530.      if (($format != "input_dot"&& (defined('GRAPHVIZ_PATH')) && (strstr(GRAPHVIZ_FORMAT$format!== FALSE))
  531.      {
  532.          mt_srand((double)microtime()*1000000);
  533.          $filename=GRAPHVIZ_TEMP.md5(uniqid(mt_rand())).".dot";
  534.          $file_handle @fopen($filename'w');
  535.          if ($file_handle)
  536.          {
  537.              fwrite($file_handle$dot);
  538.              fclose($file_handle);
  539.          }
  540.          $dotinput " -T".$format." ".$filename;
  541.  
  542.          ob_start();
  543.     passthru(GRAPHVIZ_PATH.$dotinput);
  544.          $output ob_get_contents();
  545.     ob_end_clean();
  546.          unlink($filename);
  547.          echo $output;
  548.          return TRUE;
  549.      }
  550.      elseif ($format == "input_dot")
  551.      {
  552.          echo $dot;
  553.          return TRUE;
  554.      }
  555.      else
  556.      {
  557.          return FALSE;
  558.      }
  559.  }
  560.  
  561. // end: RDfUtil
  562.  
  563. ?>

Documentation generated on Fri, 1 Jun 2007 16:50:57 +0200 by phpDocumentor 1.3.2