RDF API for PHP - graf z dokumentu RDF

0

Dostałem na uczelni zadanie... mam napisać skrypt php wizualizujący w postaci grafu dokument rdf. Wykorzystać mam bibliotekę RAP (RDF API for PHP). Korzystam z takiego tutoriala: http://www4.wiwiss.fu-berlin.de/bizer/rdfa...on_tutorial.htm Skrypt ma korzystać z programu Graphviz, który ma ten graf wyrysować (tak to rozumiem po przeczytaniu powyższego tutoriala). Oto mój kod:

<?php
define("RDFAPI_INCLUDE_DIR", "rdfapi-php/api/"); 
include(RDFAPI_INCLUDE_DIR . "RDFAPI.php");
include(RDFAPI_INCLUDE_DIR . "utilRDFUtil.php");
define('GRAPHVIZ_PATH', :Program FilesGraphviz2.20bindot.exe');
define('GRAPHVIZ_TEMP', :wampwwwRDF');
define('GRAPHVIZ_STAT', TRUE);
define('GRAPHVIZ_FORMAT', 'svg, dot, jpg, png, gif, vrml');
define('GRAPHVIZ_URI', FALSE);

$graphviz_param = array(
  GRAPH_STYLE     => 'rankdir="LR"',
  RESOURCE_STYLE  => 'style="filled",color="#FFD800",fontname="Courier",fontsize="10"',
  LITERAL_STYLE   => 'shape="box",style="filled",color="#B7FFAF",fontname="Courier",fontsize="10"',
  PREDICATE_STYLE => 'fontname="Courier",fontsize="10"',
  INFERRED_STYLE  => 'style="dotted",fontname="Courier",fontsize="10"',
  BLANKNODE_STYLE => 'style="filled",color="#DDDDDD",fontname="Courier",fontsize="10"',
  BOX_STYLE       => 'fontname="Courier",fontsize="8",color="#BBBBBB"'
);

$base="przyklad.rdf";
$model = ModelFactorygetDefaultModel();
$model->load($base);
header('Content-ty: image/svg+xml');
$model->visualize('svg');
?>

Według tutoriala powinno działać jednak ja otrzymuję komunikat o błędzie:

Błąd składni XML: błąd składni (Wiersz: 1, Znak: 0)

Potraktuj dokument jako HTML i wyświetl ponownie
Błąd:missing root element
Specyfikacja//www.w3.org/TR/REC-xml/

Nie rozumiem tego przecież nie tworzę dokumentu XML

Gdy zmienię format obrazka np w ten sposób:

header('Content-type: image/png');
$model->visualize('png');

Nie otrzymuje komunikatu o błędzie jednak obrazek nie wyświetla się

Tutaj jeszcze mój dokument przyklad.rdf:

<?xml version="1.0"?>

<r:RDF
xml:rdf="ht://www.w3.org/1999/02/22-rdf-syntax-ns#"
xml:elem="ht://www.semantict.net/RDF/introRDF/elements#">

<r:Description r:about="ht://www.semantict.net/RDF/introRDF/">
   <el:tytul>Wprowadzenie do RDF</el:tytul>
</r:Description>

<r:Description r:about="ht://www.semantict.net/RDF/introRDF/">
   <el:czesc>
       <r:Description>
           <el:rok>2007</el:rok>
           <el:tytul>Technologie Semantyczne</el:tytul>
       </r:Description>
   </el:czesc>
</r:Description>

</r:RDF>

</php>
0

header('Content-ty: image/svg+xml'); Jesteś pewien że nie xml? svg to właśnie xml :>

Jak wyskakuje błąd, to sprawdź źródło strony w poszukiwaniu błędów. A może metoda visualize nie wypluwa na wyjście tekstu a zwraca i samemu trzeba wypluć?

btw chyba pozjadało niektóre znaki w Twoim poście... albo masz duuużo błędów :>

0

a jak tak sprubojesz?

<?xml version='1.0' encoding='UTF-8'?>

<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
.....................................>
reszta ta sama, z wyjatkiem <r:

</rdf:RDF>

Widze, ze Semantic Web jest mocno eksperymentowana w akademickich kregach:)

0

Rzeczywiście po przeklejeniu kodu do postu,niektóre znaki sie nie przekleiły np sciezki..., ale w moim skrypcie jest ok.Zmieniłem header('Content-type: image/svg+xml');
$model->visualize('svg'); na header('Content-type: image/png');
$model->visualize('png'); Obrazek sie nie wyświetla.W przeglądarce pojawia się tylko miejsce na obrazek tzn np w Operze mała ramka z napisem obrazek.

0

Nadal nie działa,ale okazało się,że częśc mojego kodu który wziąłem z tutoriala to config programu graphViz,który dołączony jest do biblioteki rdf-api a nie kod który mam wstawić do skryptu :)

Teraz mój skrypt wygląda tak:


<?php
ini_set( 'display_errors', 'On' ); 
error_reporting( E_ALL );
define("RDFAPI_INCLUDE_DIR", "rdfapi-php/api/");
include(RDFAPI_INCLUDE_DIR . "RDFAPI.php");


// Filename of an RDF document
$base="przyklad.rdf";

// Create a new MemModel
$model = ModelFactory::getDefaultModel();

// Load and parse document
$model->load($base);

// Visualize model


$model->visualize('gif');
header('Content-type: image/gif');

?>

Reszta z poprzedniej wersji kodu to był config, który muszę ustawić w pliku biblioteki rdf-api constants.php, którego część odpowiedzialna za program graphviz wygląda tak:

// ----------------------------------------------------------------------------------
// GRAPHVIZ
// ----------------------------------------------------------------------------------

// path to the dot binary
define('GRAPHVIZ_PATH', 'C:\Program Files\Graphviz2.20\bin\dot.exe');

// directory for temporary files
// Attention: must be write-/readable by the webserver
define('GRAPHVIZ_TEMP', 'C:\wamp\www\RDF\temp');

// display statistical data in generated images
// currently only number of statements drawn
define('GRAPHVIZ_STAT', TRUE);

// allowed file formats
// for security reasons (to prevent code injection)
define('GRAPHVIZ_FORMAT', 'svg, dot, jpg, png, gif, vrml');

// enable clickable URIs
// only supported by certain formats (e.g. SVG)
define('GRAPHVIZ_URI', FALSE);

// define parameters for the graphical output
// if a paramter is undefined, the default value of graphviz is used
// for further information see: http://www.graphviz.org/Documentation.php
$graphviz_param = array(
   'GRAPH_STYLE'     => 'rankdir="TB"',
   'RESOURCE_STYLE'  => 'style="filled",color="#FFD800",fontname="Courier",fontsize="10"',
   'LITERAL_STYLE'   => 'shape="box",style="filled",color="#B7FFAF",fontname="Courier",fontsize="10"',
   'PREDICATE_STYLE' => 'fontname="Courier",fontsize="10"',
   'INFERRED_STYLE'  => 'style="dotted",fontname="Courier",fontsize="10"',
   'BLANKNODE_STYLE' => 'style="filled",color="#DDDDDD",fontname="Courier",fontsize="10"',
   'BOX_STYLE'       => 'fontname="Courier",fontsize="8",color="#BBBBBB"'
);

Zmieniłem tylko 2 pierwsze ściezki dostępu do pliku dot.exe i mojego katalogu tymczasowego reszta została domyślna

Graf wciąż się nie pojawia

0

Skoro teraz się nie pojawia, a wysyłasz nagłówek po wywołaniu visualize, oznacza to że visualize nie wypluwa nic na wyjście.

Tak jak pisałem wcześniej, zajrzyj do źródła wygenerowanego dokumentu albo zakomentuj tymczasowo header, zobacz faktyczne dane które skrypt generuje.

0

Wygląda na to,że mój skrypt niczego nie generuje. Wydaje mi się też,że skrypt nie wywołuje tego programu C:\Program Files\Graphviz2.20\bin\dot.exe' gdyż gdy zmieniam tą ścieżkę na jakieś bzdury nie są generowane żadne błędy.

0

Nie wiem, czy już sobie poradziłeś, ale jeśli nie, to rozważ następujące sprawy:

  1. Backslashe w ścieżce mogą powodować błędy. Spróbuj użyć slashy (mimo, że to w Windows).

  2. Ścieżka do programu zawiera spację - może to być przyczyną kłopotów. Może pomóc ujęcie ścieżki w dodatkowe cudzysłowy.

Wobec powyższego, spróbuj wpisać tak:

define('GRAPHVIZ_PATH', '"C:/Program Files/Graphviz2.20/bin/dot.exe"');

(zwróć uwagę na cudzysłowy!)

Jeśli to nie pomoże, skopiuj graphviz'a do innego katalogu, o nazwie bez spacji. Graphviz jest chyba w miarę przenośny. Wtedy znika problem spacji i wewnętrznych cudzysłowów.

  1. Zobacz (przed, jak również po powyższych zmianach), co się dzieje w katalogu tymczasowym (GRAPHVIZ_TEMP). Współpraca między RAP (RDF API for PHP) a GraphVizem wygląda tak, że RAP najpierw tworzy pliki .dot, zawierające opis grafu, następnie na jego podstawie GraphViz generuje grafy (GIF, SVG itd.). Oba rodzaje plików trafią do tego samego katalogu (różnią się tylko rozszerzeniem). Jeśli będziesz miał pliki .dot, to znaczy, że problem jest w okolicy GraphViza (może właśnie ta ścieżka do programu). Jeśli masz także .gif (czy tam .svg), to jesteś blisko celu (sprawdź jakimś programem, czy obrazek przypomina graf; pamiętaj, że firefox miał/ma jakieś problemy z SVG). Jak nie masz plików .dot, to problem jest gdzieś wcześniej...

Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1