123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362 |
- <?php
- namespace app\controller;
- require_once app()->getRootPath().'vendor/autoload.php';
- use Neoxygen\NeoClient\ClientBuilder;
- use think\facade\Request;
- use function GuzzleHttp\Psr7\str;
- use app\model\Guide;
- use app\model\GetGuide;
- use think\facade\Config;
- class Document extends CommonTwoController
- {
- // 文献指南左侧菜单
- public function menu()
- {
- $lists = [
- ['knowledge_base_name' => '文献和指南']
- ];
- foreach ($lists as $k => $v) {
- $lists[0]['subordinate'] = [['name' => '文献' , 'tag' => 'document'] , ['name' => '指南' , 'tag' => 'guide'] , ['name' => '药品' , 'tag' => 'medicine']];
- }
- return $this->_json_succ($lists);
- }
- // 文献 | 指南 搜索
- public function index()
- {
- // 标识
- $tag = Request::param('tag') ?? 'Document';
- // 分页参数
- $pn = Request::param('pn') ?? 1;
- $pagesize = 10;
- $limit = ($pn - 1) * $pagesize;
- // 是否搜索标识 is 是 notis 不是
- $is_search = Request::param('is_search') ?? 'is';
- // 排序标识
- $order = Request::param('order') ?? 'desc';
- // 搜索值
- $search = Request::param('search') ?? '';
- if('is' == $is_search) {
- if(!$search) {
- return $this->_json_succ('请求参数有误!');
- }
- }
- switch ($tag)
- {
- // 文献
- case "Document":
- $search = $search ? $search : "Alport综合征";
- $query = "CALL db.index.fulltext.queryNodes('documentFullIndex', "."'".$search."'".") YIELD node, score where node.year is not null and node.abstract is not null RETURN node skip $limit limit $pagesize";
- $data = $this->getProperty($query);
- $data = array_column($data , 'node');
- $list = [];
- $query_count = "CALL db.index.fulltext.queryNodes('documentFullIndex', "."'".$search."'"." ) YIELD node where node.year is not null and node.abstract is not null RETURN count(node) as count";
- $count_ = $this->_getTotalCount($query_count);
- foreach ($data as $key => $value)
- {
- $list[$key]['title'] = $value['name'] ?? '';
- $list[$key]['abstract'] = $value['abstract'] ?? '';
- $list[$key]['year'] = $value['year'] ?? '';
- $list[$key]['author'] = $this->getAuthorByDocument($value['name']) ?? '';
- $list[$key]['keyword'] = $this->getKeywordByDocument($value['name']);
- //$list[$key]['onlineRead'] = $this->checkDocPdfIsExist('https://zskweb.jiankangche.cn/file/wenxian/file/'.$value['name'].'.pdf');
- if(strrpos($value['name'] , '.')) {
- $list[$key]['onlineRead'] = $this->checkDocPdfIsExist('https://zskweb.jiankangche.cn/file/wenxian/file/'.$value['name'].'pdf');
- } else {
- $list[$key]['onlineRead'] = $this->checkDocPdfIsExist('https://zskweb.jiankangche.cn/file/wenxian/file/'.$value['name'].'.pdf');
- }
- }
- // foreach ($list as $k => $v) {
- // if(!$list[$k]['abstract'] && !$list[$k]['year'] && !$list[$k]['author'] && !$list[$k]['keyword']) {
- // unset($list[$k]);
- // }
- // }
- //return $this->_json_succ($list);
- $year = array_column($list , 'year');
- if($order) {
- if('asc' == $order) {
- $order = SORT_ASC;
- } else {
- $order = SORT_DESC;
- }
- }
- array_multisort($year , $order , $list);
- break;
- // 指南
- case "Guide":
- // $search = $search ? $search : "指南";
- // $query = "CALL db.index.fulltext.queryNodes('guideFullIndex', "."'".$search."'".") YIELD node, score RETURN node skip $limit limit $pagesize";
- // $data = $this->getProperty($query);
- // $data = array_column($data , 'node');
- // $list = [];
- //
- // // 统计
- // $query_count = "CALL db.index.fulltext.queryNodes('guideFullIndex', "."'".$search."'"." ) YIELD node RETURN count(node) as count";
- // $count = $this->_getTotalCount($query_count);
- if('is' === $is_search) {
- //$data = Guide::where("documentName" , "like" , "%$search%" )->select();
- $data_ = GetGuide::where("documentName" , "like" , "%$search%" )->limit($limit , $pagesize)->order('publishDate',$order)->select();
- //$count = Guide::where("documentName" , "like" , "%$search%" )->count();
- $count_ = GetGuide::where("documentName" , "like" , "%$search%" )->count();
- } else {
- $data_ = GetGuide::limit($limit , $pagesize)->order('publishDate',$order)->select();
- //$count = GetGuide::count();
- $count_ = GetGuide::count();
- }
-
- $list = [];
- //foreach ($data_ as $key => $value)
- //{
- // $list[$key]['title'] = $value['title_trans'] ?? '';
- // $list[$key]['enTitle'] = $value['title'] ?? '';
- // $list[$key]['source'] = $value['source'] ?? '';
- // $list[$key]['constitutor'] = $value['author'] ?? '';
- // $list[$key]['year'] = $value['publish_time'] ?? '';
- // $list[$key]['abstract'] = $value['abstract'] ?? '';
- // $list[$key]['abstract_trans'] = $value['abstract_trans'] ?? '';
- // is_numeric(substr($data_[$key]['publish_time'] , -4)) ? $publish_time = substr($data_[$key]['publish_time'] , -4) : $publish_time = substr($data_[$key]['publish_time'] , 0 , 4);
- // $list[$key]['publish_time'] = $publish_time;
- // $list[$key]['full_text_url'] = $value['full_text_url'] ?? '';
- //$list[$key]['full_text_url'] = 'http://182.43.12.243:8981/lcznpdf/'.rtrim($value['title_trans'],'。').'.pdf';;
- // $list[$key]['onlineRead'] = $value['pdf'] ? 'https://jm.admin.jiankangche.cn/uploads/'.$value['pdf'] : '';
- //}
- //$publishTime = array_column($list , 'publish_time');
- //if($order) {
- // if('asc' == $order) {
- // $order = SORT_ASC;
- // } else {
- // $order = SORT_DESC;
- // }
- //}
- //array_multisort($publishTime , $order , $list);
- foreach ($data_ as $key => $value){
- $list[$key]['department'] = $value['department'] ?? '';
- $list[$key]['sickName'] = $value['sickName'] ?? '';
- $list[$key]['documentName'] = $value['documentName'] ?? '';
- $list[$key]['year'] = $value['year'] ?? '';
- $list[$key]['publishDate'] = $value['publishDate'] ?? '';
- $list[$key]['enTitle'] = $value['enTitle'] ?? '';
- $list[$key]['constitutor'] = $value['constitutor'] ?? '';
- $list[$key]['source'] = $value['source'] ?? '';
- $list[$key]['abstract'] = $value['abstract'] ?? '';
- $list[$key]['abstract_trans'] = $value['abstract_trans'] ?? '';
- $list[$key]['url'] = $this->checkDocPdfIsExist('http://106.225.184.197:8981/lcznpdf/'.$value['documentName'].'.pdf');
- //$list[$key]['url'] = 'http://106.225.184.197:8981/lcznpdf/'.$value['documentName'].'.pdf';
- }
- break;
- }
- return $this->_json_succ(['count' => $count_ , 'list' => $list]);
- }
- private function checkDocPdfIsExist($url)
- {
- $check = get_headers($url);
- if(strstr($check[0] , '200')) {
- return $url;
- }
- return "";
- }
- // 文献详情
- public function detail()
- {
- $tag = Request::param('tag') ?? 'Document';
- $title = Request::param('title') ?? '';
- $query = "match(n:Document) where n.name = "."'".$title."'"." return n";
- $data = $this->getProperty($query);
- $data = array_column($data , 'n');
- // 获取 文献的作者 参考文献 引证文献
- $query1 = "match p=(n:Document {name:"."'".$title."'"."}) -[r:LinkAuthor|LinkReference|LinkCitationDocument]-(m) return m.name as mname, m.kgid as kgid, r.name as rname";
- $data1 = $this->getProperty($query1);
- foreach ($data1 as $key => $value)
- {
- if(($value['rname'] == "作者")) {
- $authors[] = ['name' => $value['mname'] , 'kgid' => $value['kgid']];
- }
- if(($value['rname'] == "参考文献")) {
- $rer[] = $value['mname'];
- $wx = ['titles' => $rer];
- }
- }
- $list = [
- 'title' => $data[0]['name'] ?? '',
- 'abstract' => $data[0]['abstract'] ?? '',
- 'author' => $authors ?? [],
- 'keyword' => '',
- 'publishMagazine' => $data[0]['publishMagazine'] ?? '',
- 'similarDocument' => $wx ?? [], // 参考文献
- 'citationDocument' => [], // 引证文献
- ];
- return $this->_json_succ($list);
- }
- // 作者详情
- public function authorDetail()
- {
- $kgid = Request::param('kgid');
- $query = "match(n:Thing) where n.kgid = "."'".$kgid."'"."return n.name as name , n.focusField as focusField , n.organization as organization limit 1";
- $data = $this->getProperty($query);
- $list = [
- 'name' => $data[0]['name'],
- 'focusField' => explode('||' ,$data[0]['focusField']),
- 'organization' => $data[0]['organization'],
- 'authorDocument' => $this->getDocumentByAuthor($kgid),
- ];
- return $this->_json_succ($list);
- }
- // 热点研究方向
- public function getHotList()
- {
- $title = Request::param('title') ?? '诊断';
- $query = "CALL db.index.fulltext.queryNodes('documentFullIndex', "."'".$title."'".") YIELD node match p=(node)-[r:LinkKeyword]-(k:Keyword) with node.year as year, k.name as keyword,
- count(*) as cnt order by year desc, cnt desc return year, apoc.agg.slice(keyword, 0, 5) AS hots, apoc.agg.slice(cnt, 0, 5) as count limit 5";
- $data = $this->getProperty($query);
- foreach ($data as $key => $value) {
- for ($i=0;$i<5;$i++) {
- $data[$key]['hots'] = [
- [
- 'name' => $value['hots'][0] ,
- 'count' => $value['count'][0]
- ],
- [
- 'name' => $value['hots'][1] ,
- 'count' => $value['count'][1]
- ],
- [
- 'name' => $value['hots'][2] ,
- 'count' => $value['count'][2]
- ],
- [
- 'name' => $value['hots'][3] ,
- 'count' => $value['count'][3]
- ],
- [
- 'name' => $value['hots'][4] ,
- 'count' => $value['count'][4]
- ]
- ];
- }
- unset($data[0]);
- unset($data[$key]['count']);
- }
- rsort($data);
- return $this->_json_succ($data);
- }
- // 作者图谱
- public function authorGraph()
- {
- $hot = Request::param('hot_name') ?? "心力衰竭";
- $id = $this->_getId($hot);
- $query = "match (a0:Author)<-[r:LinkAuthor]-(:Document)-[:LinkKeyword]->(k:Keyword {name:"."'".$hot."'"."}) with a0, k, count(r.name) as cnt order by cnt desc with k, apoc.agg.slice(a0, 0,10) as authors unwind authors as author with k, author call apoc.create.vRelationship(k,'LinkToKeyword',{}, author) yield rel return k, author, rel";
- $data = $this->getProperty($query);
- $lists = [];
- foreach ($data as $key => $value)
- {
- $lists[$key]['start']['identity'] = $id;
- $lists[$key]['start']['labels'] = ['Document' , 'Thing'];
- $lists[$key]['start']['properties']['name'] = ['name' => '热点名称' , 'text' => $value['k']['name']];
- $lists[$key]['end']['identity'] = $this->_getId($value['author']['kgid'] , 'endid');
- $lists[$key]['end']['labels'] = ['Thing' , 'Author'];
- $lists[$key]['end']['properties']['name'] = ['name' => '作者' , 'text' => $value['author']['name']];
- $lists[$key]['end']['properties']['organization'] = ['name' => '所属单位' , 'text' => $value['author']['organization']];
- $lists[$key]['relationship']['start'] = $id;
- $lists[$key]['relationship']['end'] = $this->_getId($value['author']['kgid'] , 'endid');
- $lists[$key]['relationship']['type'] = 'LINKAUTHOR';
- $lists[$key]['relationship']['properties']['@type'] = [
- "LinkAuthor",
- "CnsLink"
- ];
- $lists[$key]['relationship']['properties']['name'] = '作者';
- }
- return $this->_json_succ($lists);
- }
- // 获取热点对应作者的kgid
- public function getHotAuthorKgids($hot = '')
- {
- $query1 = "match(n:Author) where n.focusField ="."'".$hot."'"." return n.name as name, n.kgid as kgid limit 10";
- $data1 = $this->getProperty($query1);
- //dump($data1);die;
- return array_column($data1 , 'kgid');
- }
- // 获取作者的文献
- private function getDocumentByAuthor($kgid)
- {
- $query = "match(n:Document)-[r:LinkAuthor]-(m:Author) where m.kgid="."'".$kgid."'"." return n.name as name";
- $data = $this->getProperty($query) ?? [];
- return $data ? array_column($data, 'name') : [];
- }
- // 获取文献的作者
- private function getAuthorByDocument($title)
- {
- if(strstr($title , "'")) {
- $title = trim(str_replace("'","",$title));
- $query = "match(n:Document)-[r:LinkAuthor]-(m:Thing) where n.name= "."'".$title."'"." return m.name as name , m.kgid as kgid";
- } elseif (strstr($title , '"')) {
- $title = trim(str_replace('"',"",$title));
- $query = 'match(n:Document)-[r:LinkAuthor]-(m:Thing) where n.name= '.'"'.$title.'"'.' return m.name as name , m.kgid as kgid';
- } else {
- $query = "match(n:Document)-[r:LinkAuthor]-(m:Thing) where n.name= "."'".$title."'"." return m.name as name , m.kgid as kgid";
- }
- $data = $this->getProperty($query) ?? [];
- return $data ?? [];
- }
- // 获取文献的关键词
- private function getKeywordByDocument($title)
- {
- if(strstr($title , "'")) {
- $title = trim(str_replace("'","",$title));
- $query = "match(n:Document)-[r:LinkKeyword]-(m:Keyword) where n.name= "."'".$title."'"." return m.name as name";
- } elseif (strstr($title , '"')) {
- $title = trim(str_replace('"',"",$title));
- $query = 'match(n:Document)-[r:LinkKeyword]-(m:Keyword) where n.name= '."'".$title."'".'return m.name as name';
- } else {
- $query = "match(n:Document)-[r:LinkKeyword]-(m:Keyword) where n.name= "."'".$title."'"." return m.name as name";
- }
- $data = $this->getProperty($query) ?? [];
- return $data ? array_column($data , 'name') : [];
- }
- }
|