cd<프로젝트 디렉터리>
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
deactivateneo4j의 import 폴더에 현재 프로젝트의 data를 복사해서 넣습니다.
그 후 아래 사이퍼 쿼리를 실행합니다.
// city node 생성LOADCSVWITHHEADERSFROM"file:///citycode.csv"ASrowCREATE(c:city{city_nm: row.city_name,city_id : row.city_id,location : point({latitude:toFloat(row.y),longitude:toFloat(row.x)}),latitude:toFloat(row.y),longitude:toFloat(row.x)});//LOAD TRANSPORTATION (as relationships)LOADCSVwithheadersfrom"file:///transportations.csv"asrowMATCH(c1:city),(c2:city)WHEREc1.city_id=row.depart_idANDc2.city_id=row.dest_idMERGE(c1)-[r:goes{tid: row.transportation_id,depart_time:time(row.depart_time),destination_time: coalesce(row.destination_time,"0"),grade:row.grade,fare:toInteger(coalesce(row.fare,"0")),duration:row.duration,trans_cate:row.trans_cate,depart_time_str:row.depart_time,destination_time_str: row.destination_time}]->(c2);//거리넣기match(a:city)-[r:goes]->(b:city)setr.dist=(point.distance(a.location,b.location))/1000;//토탈거리로 제한걸기 MATCHp=(c1:city{city_id:"C01"})-[rels:goes*2..3]->(c2:city{city_id:"C10"})WHERErels[0].depart_time<time('10:00')ANDreduce(total=0,rinrels|total+r.dist)<400RETURNnodes(p)asnode,relationships(p)asrelsLIMIT500;//LOAD attractions LOADCSVWITHHEADERSFROM"file:///attractions.csv"ASrowCREATE(a:attraction{attraction_id: row.attraction_id,attraction_nm: row.attraction_nm,address: row.address,theme: row.theme,city_nm: row.city_nm,city_id:row.city_id,rate : toFloat(row.rate),longitude:toFloat(row.longitude),latitude:toFloat(row.latitude)});// Make relationships with attraction to cityMATCH(a:attraction),(c:city)WHEREa.city_id=c.city_idMERGE(c)-[has:attraction]->(a);//LOAD restaurants LOADCSVWITHHEADERSFROM"file:///restaurants.csv"ASrowCREATE(r:restaurants{rest_id:row.rest_id,rest_nm: row.rest_nm,rest_cat:row.rest_cat,address: row.address,city: row.city_nm,city_id:row.city_id,rate : toFloat(row.rate),longitude:toFloat(row.longitude),latitude:toFloat(row.latitude)});// Make relationships with restaurants to cityMATCH(r:restaurants),(c:city)WHEREr.city_id=c.city_idMERGE(c)-[has:restaurant]->(r);// LOAD accomodationLOADCSVWITHHEADERSFROM"file:///accomodation.csv"ASrowCREATE(ac:accomodation{accom_nm:row.accom_nm,accom_id:row.accom_id,city_id: row.city_id,accom_nm:row.accom_nm,address:row.address,rate:toFloat(row.rate)});// Make relationships with accomodation to cityMATCH(ac:accomodation),(c:city)WHEREac.city_id=c.city_idMERGE(ac)-[has:accomodation]->(r)흥미로운 사이퍼쿼리를 만듭니다.
(a) 각 도시별 경로를 리턴하는 쿼리입니다.
MATCH p=(:city{city_id:"C01"})-[rels:goes*1..2]->(:city{city_id:"C22"})
where rels[0].depart_time < time('10:35')
with nodes(p) as cities, p
return distinct cities
;
(b) 교통비 총액이 N원 이상/이하인 경로 찾기
//조건에 sum 붙이기 -- reduce 함수 쓰기
MATCH p=(c1:city{city_nm:"서울"})-[rels:goes*1..2]->(c2:city{city_nm:"강릉"})
where rels[0].depart_time < time('10:35') and reduce(total = 0, r IN rels | total + r.fare)>20000
return p
;


