Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用php sparql仅获取wikidata上存在的项的标签_Javascript_Php_Sparql_Rdfs_Easyrdf - Fatal编程技术网

Javascript 使用php sparql仅获取wikidata上存在的项的标签

Javascript 使用php sparql仅获取wikidata上存在的项的标签,javascript,php,sparql,rdfs,easyrdf,Javascript,Php,Sparql,Rdfs,Easyrdf,我正在使用PHP和RDF4J工作台服务进行一个个人项目,我有一个包含3个上下文的存储库,一个用于机器人类别,一个用于属于这些类别的机器人,另一个用于存储初始数据的wikidata标识符的owl:sameAs属性 问题在于,用户可以插入机器人,而新插入的机器人将不会链接到wikidata标识符,而是通过删除额外的空间并连接用户插入的名称而产生唯一的URI。现在,当我查询我需要的数据时,我希望显示所有这些机器人,但如果我的查询如下: PREFIX : <http://example.com#&

我正在使用PHP和RDF4J工作台服务进行一个个人项目,我有一个包含3个上下文的存储库,一个用于机器人类别,一个用于属于这些类别的机器人,另一个用于存储初始数据的wikidata标识符的owl:sameAs属性

问题在于,用户可以插入机器人,而新插入的机器人将不会链接到wikidata标识符,而是通过删除额外的空间并连接用户插入的名称而产生唯一的URI。现在,当我查询我需要的数据时,我希望显示所有这些机器人,但如果我的查询如下:

PREFIX : <http://example.com#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX wdt: <http://www.wikidata.org/prop/direct/> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 
PREFIX wd: <http://www.wikidata.org/entity/> 
SELECT ?name ?image ?releaseDate ?skills ?manufacturer ?mass
 WHERE { 
         { SELECT ?robot ?image ?releaseDate ?skills ?manufacturer ?mass 
              WHERE {
                     <http://example.com#EducationalRobots> a :Category; :hasRobots [:idRobot ?x] .      
                     ?x owl:sameAs ?robot . 
                     ?x :hasImage ?image . 
                     ?x :releaseDate ?releaseDate . 
                     ?x :hasSkills ?skills . 
                     ?x :manufacturer ?manufacturer. 
                     ?x :hasMass ?mass
                    } 
             } 
    SERVICE <https://query.wikidata.org/sparql> { 
             ?robot rdfs:label ?name .
             FILTER(lang(?name)="en") 
        } 
}
最后,我只会得到我插入的初始语句,那些确实链接了wikidata标识符的语句。所以我想在后端做些改变,使用一个if语句,我可以询问请求类别中的项目是否有标识符,如果有,则执行一个特定的查询,即上面的查询,否则只需替换查询并检索本地URI。但是,难道没有一种直接在查询中执行此操作的方法,因此代码看起来更干净吗?例如SELECTIF语句等等。我不熟悉高级查询实践,如有任何建议,我将不胜感激

图表的片段:

请求:

function getDetails(id) {
  //console.log(id);
  let url = "query.php";
  $.ajax({
    type: "POST",
    url:url,
    data: {"id": id },
    success: function (response){
      let final = JSON.parse(response);
      console.log(final.results);
      $('#tableId').find('tbody')
          .empty();

      final.results.bindings.forEach((item, index)=>{   
        console.log(item);
        if (item.name) { 
          s = item.name;
          id = s.split(" ").join("");  

             $('#tableId').find('tbody')
                .append($(`<tr id=${id} class="border_bottom">`)
                  .append($('<td class="mt-3 text-center">')
                    .append(`<p class='mt-4'><b><i>${item.name.value} </i></b></p><br><button class='btn btn-danger' id='${item.name.value}' onclick="deleteMovie(this.id, '${id}')">Delete</button></div>`)
                  )
                  .append($('<td class="text-center">')
                    .append($('<img height="150" width="250">')
                      .attr('src', 'images/'+item.image.value)
                    )
                  )
                  .append($('<td>')
                    .append($('<small> Manufacturer: </small><p>'+ item.manufacturer.value+ '</p><small>Release date: </small><p>' + item.releaseDate.value +'</p><small>Skills: </small><p>'+item.skills.value +'</p><small> Mass: </small><p>'+item.mass.value + ' kg</p>'))
                  )
                )     
        }
    })   
    }
  });
}
在后端,我正在使用EasyRdf\Sparql\Client:

<?php

$id = $_POST['id'];

require 'vendor/autoload.php';

$address = "http://localhost:8080/rdf4j-server/repositories/graph?query=";
 
$query = "PREFIX : <http://example.com#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX wdt: <http://www.wikidata.org/prop/direct/> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 
PREFIX wd: <http://www.wikidata.org/entity/> 
SELECT ?name ?image ?releaseDate ?skills ?manufacturer ?mass
 WHERE { { SELECT ?robot ?image ?releaseDate ?skills ?manufacturer ?mass WHERE {<".$id."> a :Category; :hasRobots [:idRobot ?x] . ?x owl:sameAs ?robot . ?x :hasImage ?image . ?x :releaseDate ?releaseDate . ?x :hasSkills ?skills . ?x :manufacturer ?manufacturer. ?x :hasMass ?mass} } SERVICE <https://query.wikidata.org/sparql> { ?robot rdfs:label ?name . FILTER(lang(?name)=\"en\") } }";


$qry = urlencode($query);
//  print $qry;

$client = new EasyRdf\Http\Client($address.$qry);

$client->setHeaders("Accept","application/sparql-results+json");

$resultJSON = $client->request()->getBody();

// print $resultJSON;

$finalResult = new EasyRdf\Sparql\Result($rezultatJSON,"application/sparql-results+json");
// print $finalResult;

return $finalResult;
谢谢大家!

最后的查询:

PREFIX : <http://example.com#>  
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>  
PREFIX wdt: <http://www.wikidata.org/prop/direct/>  
PREFIX owl: <http://www.w3.org/2002/07/owl#>  
PREFIX wd: <http://www.wikidata.org/entity/>  

SELECT ?name ?image ?releaseDate ?skills ?manufacturer ?mass 
FROM :robots FROM :samenessgraph FROM :categories  WHERE {
  :EducationalRobots a :Category; :hasRobots [:idRobot ?x] .                            
  ?x :hasImage ?image .   
  ?x :releaseDate ?releaseDate .  
  ?x :hasSkills ?skills .   
  ?x :manufacturer ?manufacturer .   
    ?x :hasMass ?mass . 
  OPTIONAL { ?x owl:sameAs ?robot } 
  BIND(COALESCE(?robot, "unknown") as ?input) OPTIONAL {     
    SERVICE <https://query.wikidata.org/sparql> {               
      ?input rdfs:label ?wdName .              
      FILTER(lang(?name)="en")          
    }          
  }     
  OPTIONAL { ?x rdfs:label ?label }     
  BIND(COALESCE(?wdName, ?label, strafter(str(?x), str(:))) as ?name) }

如评论中所述。

是的,您可以在这里找到它:前缀:前缀rdfs:前缀wdt:前缀owl:前缀wd:选择?名称?图像?发布日期?技能?制造商?质量来源:机器人来源:SamenesGraph来源:类别其中{:教育机器人a:类别;:hasRobots[:idRobot?x]x:hasImage?image。?x:releaseDate?releaseDate。?x:hasSkills?技能。?x:manufacturer?manufacturer。?x:hasMass?mass.可选{x owl:sameAs?robot}绑定聚合?robot,as?输入可选{服务{输入rdfs:label?wdName.FILTERlang name=en}}可选{x rdfs:label?label}bindcaleasce?wdName,?label,strafterstr?x,str:as?name}此查询首先获取Wikidata名称,然后是数据中的可选标签,最后是URI的本地名称。也许这就是你想要的,如果不是,请澄清。顺便说一句,你的一些日期文字是无效的。模式为YYYY-MM-DD,您混淆了月份和日期位置。请不要忘记接受您自己的答案以将其标记为已解决。干杯,只要我能做到。干杯