研究了研究 发现 RAP 有一个跟 SQL 语法很相似的东西
在SQL: $query="SELECT siren FROM table WHERE 1"
在RDQL 中
$query = 'SELECT ?siren
WHERE (?x ,<v:root>,?siren)
USING v FOR <http://www.baidu.com/#>
';
我先把我 rdf文件贴出来 大家可以参考参考
<?xml version='1.0' encoding='UTF-8'?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ns1="http://www.w3.org/2001/vcard-rdf/3.0#" xmlns:ns3="http://www.baidu.com/#" xmlns:ns4="http://www.google.com/#" xmlns:ns2="http://sampleVocabulary.org/1.3/People#"> <rdf:Description rdf:about="http://example.com/employees/BillParker/"> <ns2:age>测试ns22222222222输出来的东西</ns2:age> <ns2:Siren>测试ns222222输出来的东西</ns2:Siren> <ns3:root>测试ns3333333输出来的东西</ns3:root> <ns4:google>测试ns4444输出来的东西</ns4:google> </rdf:Description> </rdf:RDF>
下面是 自己的 index.php 文件
<?php /** * @author [斯人] * @date 2010/6/1/10:16 * @ * */ define("RDFAPI_INCLUDE_DIR", "E:/siren/rdfapi-php/api/"); include (RDFAPI_INCLUDE_DIR . "RDFAPI.php"); // Filename of an RDF document $base = "employees.rdf"; // Create a new MemModel $model = ModelFactory::getDefaultModel(); // Load and parse document $model->load($base); // query string //$rdql_query = ' //SELECT ?siren,?age //WHERE (?x, <v:Siren>, ?siren), // (?a,<v:age>,?age) //USING vcard FOR <http://www.w3.org/2001/vcard-rdf/3.0#> // v FOR <http://sampleVocabulary.org/1.3/People#>'; $rdql_query = 'SELECT ?siren WHERE (?x ,<v:root>,?siren) USING v FOR <http://www.baidu.com/#> '; //query model, get RDQLResultIterator $rdqlIter = $model->rdqlQueryasIterator($rdql_query); //get different Result labels as array $result_labels = $rdqlIter->getResultLabels(); echo "<BR><b>Result Label Names:</b> "; for ($i = 0; $i < count($result_labels); $i++) echo $result_labels[$i] . " "; echo "<BR><B>Number of results:</B> " . $rdqlIter->countResults(); //serialize result to string; echo "<BR><B>Result objects, serialized to string:</B><BR>"; while ($rdqlIter->hasNext()) { $curren_result = $rdqlIter->next(); echo "<BR>"; for ($j = 0; $j < count($result_labels); $j++) echo $curren_result[$result_labels[$j]]->toString() . "<BR> "; } ; ?>
在上面的语句中 执行的结果就是
我们把 $rdql_query改一下...
$rdql_query = 'SELECT ?siren WHERE (?x ,<v:age>,?siren) USING v FOR <http://sampleVocabulary.org/1.3/People#>';
执行结果是
Literal("测试ns2输出来的东西")
我们在改一下..
$rdql_query = 'SELECT ?siren WHERE (?x ,<v:google>,?siren) USING v FOR <http://www.google.com/#>';
执行结果为
Literal("测试ns4444输出来的东西");
有没有发现上面规律???
下面说说我个人的理解..
以 $rdql_query = 'SELECT ?siren WHERE (?x ,<v:google>,?siren) USING v FOR <http://www.google.com/#>';
为例select 不用说 ..跟SQL 同意
后面的 ?siren 应该就是一个变量 它必须要跟 where 语句里面的 第三个参数对应..多个 可以用 逗号","隔开
例如
$rdql_query = 'SELECT ?siren,?google WHERE (?x ,<v:google>,?siren) ,WHERE (?x ,<v:google>,?google) USING v FOR <http://www.google.com/#>';
where括号里面的 参数 就是 主语,谓语,宾语,,第一个是主语..随便设置但前面必须要加 "?"问号,
中间的 <v:google> 就是 rdf中的命名空间..这里为什么是v 而不是 <ns4:google> 呢?
这是因为后面的 USING v FOR <http://www.google.com/#> 语句的关系..
在 rd文件里面 是这样的语句
xmlns:ns4="http://www.google.com/#"
USING v FOR <http://www.google.com/#> 语句就是 用v 代替 值为 http://www.google.com/# 的 一个变量吧..
跟 SQL 语句中 select user as v 类似..
目的应该就是把一个长的 名字空间 用一个值代替...
然后 RAP 就会根据 这个语法 去从rdf中取出数据来...
有的时候可以 加上 from 就是
$rdql_query = 'SELECT ?siren from <exaple.rdf> WHERE (?x ,<v:google>,?siren) USING v FOR <http://www.google.com/#>';
它用来告诉 RAP 源 是哪个文件...因为 程序里面已经定义了文件 所以这里就不用写了
自己理解是这样 高手莫见笑...欢迎大家交流..