Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

Expand Down Expand Up @@ -90,4 +92,28 @@ public SuccessResponse<nodeDetailDto> getNode(@PathVariable("graphId") Long grap
return SuccessResponse.of(result);
}

@PostMapping("/{graphId}")
@Operation(summary = "λ…Έλ“œ μΆ”κ°€", description = "지식 κ·Έλž˜ν”„μ—μ„œ λ…Έλ“œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.")
@ApiResponses({
@ApiResponse(
responseCode = "200",
description = "λ…Έλ“œκ°€ μ„±κ³΅μ μœΌλ‘œ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.",
content = @Content(
mediaType = "application/json",
schema = @Schema(example = "{\"message\":\"\"}")
)
)
})

public SuccessResponse<knowledgeGraphDto> addNode(
@PathVariable("graphId")
Long graphId,
@RequestBody @Valid @NotNull(message = "μΆ”κ°€ν•  그룹을 μž…λ ₯ν•΄μ£Όμ„Έμš”.")
String group,
@RequestBody @Valid @NotNull(message = "μΆ”κ°€ν•  라벨을 μž…λ ₯ν•΄μ£Όμ„Έμš”.")
String label) {
knowledgeGraphDto result = graphService.addNode(graphId,group,label);
return SuccessResponse.of(result);
}

}
21 changes: 21 additions & 0 deletions src/main/java/com/going/server/domain/graph/entity/Edge.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.going.server.domain.graph.entity;


import lombok.*;
import org.springframework.data.neo4j.core.schema.GeneratedValue;
import org.springframework.data.neo4j.core.schema.Id;
import org.springframework.data.neo4j.core.schema.Node;

@Node("Edge")
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Edge {
@Id @GeneratedValue
private Long id;
private String source;
private String target;
private String label;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.going.server.domain.graph.repository;

import com.going.server.domain.graph.entity.Edge;
import org.springframework.data.neo4j.repository.Neo4jRepository;

public interface EdgeRepository extends Neo4jRepository<Edge, Long> {
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,6 @@ public interface graphService {
knowledgeGraphDto getGraph(Long graphId);

nodeDetailDto getNode(Long graphId, Long nodeId);

knowledgeGraphDto addNode(Long graphId, String group,String label);
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,19 @@ public nodeDetailDto getNode(Long graphId, Long nodeId) {
//TODO : nodeId둜 λ…Έλ“œ μ°ΎκΈ°
return nodeDetailDto.from(null,null,null,null,null);
}

@Override
public knowledgeGraphDto addNode(Long graphId,String group,String label) {
//TODO : graphId둜 κ·Έλž˜ν”„ μ°ΎκΈ°
//TODO : group μΆ”κ°€ν•˜λŠ” μ½”λ“œ μž‘μ„±
//TODO : label μΆ”κ°€ν•˜λŠ” μ½”λ“œ μž‘μ„±

//TODO : nodeDto에 κ°’ λ§€ν•‘ν•˜λŠ” μ½”λ“œ μž‘μ„±
List<nodeDto> nodeDto = new ArrayList<>();

//TODO : edgeDto에 κ°’ λ§€ν•‘ν•˜λŠ” μ½”λ“œ μž‘μ„±
List<edgeDto> edgeDto = new ArrayList<>();

return knowledgeGraphDto.of(nodeDto,edgeDto);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
package com.going.server.domain.upload.service;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.going.server.domain.graph.dto.edgeDto;
import com.going.server.domain.graph.dto.nodeDto;
import com.going.server.domain.graph.entity.Edge;
import com.going.server.domain.graph.repository.EdgeRepository;
import com.going.server.domain.ocr.OcrService;
import com.going.server.domain.ocr.PdfOcrService;
import com.going.server.domain.upload.dto.UploadRequestDto;
Expand All @@ -11,13 +18,17 @@
import org.springframework.web.server.ResponseStatusException;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
@RequiredArgsConstructor
public class UploadServiceImpl implements UploadService {
private final OcrService ocrService;
private final PdfOcrService pdfOcrService;
private final EdgeRepository edgeRepository;
@Value("${ocr.api.url}")
private String apiUrl;
@Value("${ocr.api.secret-key}")
Expand All @@ -26,17 +37,40 @@ public class UploadServiceImpl implements UploadService {
@Override
public UploadResponseDto uploadFile(UploadRequestDto dto) {
try {
String jsonResponse = ocrService.processOcr(dto.getFile(),apiUrl,secretKey);
//System.out.println("jsonResponse: "+jsonResponse);
String jsonResponse = ocrService.processOcr(dto.getFile(), apiUrl, secretKey);
Map<String, String> paresData = pdfOcrService.parse(jsonResponse);
//System.out.println("paresData: "+paresData);

String text = paresData.get("6ν•™λ…„ 읽기자료 λ‚΄μš©");
System.out.println("μΆ”μΆœλœ ν…μŠ€νŠΈ: "+text);
System.out.println("μΆ”μΆœλœ ν…μŠ€νŠΈ: " + text);

//TODO : κ·Έλž˜ν”„ 생성을 μœ„ν•œ FastApi 호좜 μ½”λ“œ μž‘μ„±
ObjectMapper mapper = new ObjectMapper();
InputStream is = getClass().getClassLoader().getResourceAsStream("data.json");
JsonNode root = mapper.readTree(is);
JsonNode dataNode = root.get("data");
JsonNode edgesNode = dataNode.get("edges");

//TODO : 데이터 λ°›μ•„μ™€μ„œ DB에 μ €μž₯
List<Edge> edgeList = new ArrayList<>();

for (JsonNode edgeNode : edgesNode) {
if (!edgeNode.has("source") || !edgeNode.has("target") || !edgeNode.has("label")) {
System.out.println("ν•„λ“œ λˆ„λ½: " + edgeNode.toPrettyString());
continue;
}

String source = edgeNode.get("source").asText();
String target = edgeNode.get("target").asText();
String label = edgeNode.get("label").asText();

Edge edge = Edge.builder()
.source(source)
.target(target)
.label(label)
.build();

edgeList.add(edge);
}

edgeRepository.saveAll(edgeList);
System.out.println("총 " + edgeList.size() + "개의 edgeκ°€ μ €μž₯λ˜μ—ˆμŠ΅λ‹ˆλ‹€.");

return UploadResponseDto.from(
null,
Expand All @@ -46,9 +80,9 @@ public UploadResponseDto uploadFile(UploadRequestDto dto) {
null,
null
);
} catch (IllegalArgumentException e){
} catch (IllegalArgumentException e) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, e.getMessage());
} catch (IOException e){
} catch (IOException e) {
throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, e.getMessage());
}
}
Expand Down
67 changes: 67 additions & 0 deletions src/main/resources/data.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
{
"isSuccess": true,
"code": "201",
"message": "μ§€μ‹κ·Έλž˜ν”„ 생성에 μ„±κ³΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€.",
"data" : {
"nodes": [
{
"id": "1",
"label": "동물",
"group": 1,
"level": 0,
"description": "기린은 μ„Έκ³„μ—μ„œ κ°€μž₯ ν‚€κ°€ 큰 λ™λ¬Όλ‘œ, 길게 뻗은 λͺ©μ„ μ΄μš©ν•΄ 높은 λ‚˜λ¬΄μ˜ μžŽμ„ λ¨ΉμŠ΅λ‹ˆλ‹€. μ΄ˆμ‹λ™λ¬Όμ΄λ©° 아프리카 μ‚¬λ°”λ‚˜μ—μ„œ 주둜 μ„œμ‹ν•˜κ³ , κΈΈκ³  νŠΌνŠΌν•œ λ‹€λ¦¬λ‘œ 천천히 μ΄λ™ν•˜λ©°, μ²œμ μ„ ν”Όν•  λ•ŒλŠ” 맀우 λΉ λ₯Έ μ†λ„λ‘œ 달릴 수 μžˆμŠ΅λ‹ˆλ‹€."
},
{
"id": "2",
"label": "고양이",
"group": 2,
"level": 1,
"description": "기린은 μ„Έκ³„μ—μ„œ κ°€μž₯ ν‚€κ°€ 큰 λ™λ¬Όλ‘œ, 길게 뻗은 λͺ©μ„ μ΄μš©ν•΄ 높은 λ‚˜λ¬΄μ˜ μžŽμ„ λ¨ΉμŠ΅λ‹ˆλ‹€. μ΄ˆμ‹λ™λ¬Όμ΄λ©° 아프리카 μ‚¬λ°”λ‚˜μ—μ„œ 주둜 μ„œμ‹ν•˜κ³ , κΈΈκ³  νŠΌνŠΌν•œ λ‹€λ¦¬λ‘œ 천천히 μ΄λ™ν•˜λ©°, μ²œμ μ„ ν”Όν•  λ•ŒλŠ” 맀우 λΉ λ₯Έ μ†λ„λ‘œ 달릴 수 μžˆμŠ΅λ‹ˆλ‹€."
},
{
"id": "3",
"label": "토끼",
"group": 2,
"level": 1,
"description": "기린은 μ„Έκ³„μ—μ„œ κ°€μž₯ ν‚€κ°€ 큰 λ™λ¬Όλ‘œ, 길게 뻗은 λͺ©μ„ μ΄μš©ν•΄ 높은 λ‚˜λ¬΄μ˜ μžŽμ„ λ¨ΉμŠ΅λ‹ˆλ‹€. μ΄ˆμ‹λ™λ¬Όμ΄λ©° 아프리카 μ‚¬λ°”λ‚˜μ—μ„œ 주둜 μ„œμ‹ν•˜κ³ , κΈΈκ³  νŠΌνŠΌν•œ λ‹€λ¦¬λ‘œ 천천히 μ΄λ™ν•˜λ©°, μ²œμ μ„ ν”Όν•  λ•ŒλŠ” 맀우 λΉ λ₯Έ μ†λ„λ‘œ 달릴 수 μžˆμŠ΅λ‹ˆλ‹€."

},
{
"id": "4",
"label": "κΈ°λ¦°",
"group": 2,
"level": 1,
"description": "기린은 μ„Έκ³„μ—μ„œ κ°€μž₯ ν‚€κ°€ 큰 λ™λ¬Όλ‘œ, 길게 뻗은 λͺ©μ„ μ΄μš©ν•΄ 높은 λ‚˜λ¬΄μ˜ μžŽμ„ λ¨ΉμŠ΅λ‹ˆλ‹€. μ΄ˆμ‹λ™λ¬Όμ΄λ©° 아프리카 μ‚¬λ°”λ‚˜μ—μ„œ 주둜 μ„œμ‹ν•˜κ³ , κΈΈκ³  νŠΌνŠΌν•œ λ‹€λ¦¬λ‘œ 천천히 μ΄λ™ν•˜λ©°, μ²œμ μ„ ν”Όν•  λ•ŒλŠ” 맀우 λΉ λ₯Έ μ†λ„λ‘œ 달릴 수 μžˆμŠ΅λ‹ˆλ‹€."
},
{
"id": "5",
"label": "μ›μˆ­μ΄",
"group": 2,
"level": 1,
"description": "μ›μˆ­μ΄λŠ” μ‚¬λžŒκ³Ό μœ μ „μ μœΌλ‘œ κ°€κΉŒμš΄ 영μž₯λ₯˜μ— μ†ν•˜λ©°, 높은 μ§€λŠ₯κ³Ό 손을 μ΄μš©ν•œ λ‹€μ–‘ν•œ 도ꡬ μ‚¬μš© λŠ₯λ ₯을 κ°–μΆ”κ³  μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λ¬΄λ₯Ό 잘 타며 무리λ₯Ό μ§€μ–΄ μƒν™œν•˜κ³ , 감정 ν‘œν˜„μ΄ ν’λΆ€ν•˜λ©° μ‚¬νšŒμ  행동이 λ°œλ‹¬ν•΄ μžˆμŠ΅λ‹ˆλ‹€."
},
{
"id": "6",
"label": "μΆ”λ‘ ",
"group": 2,
"level": 2,
"description": "좔둠은 κ΄€μ°°ν•˜κ±°λ‚˜ μ•Œκ³  μžˆλŠ” 사싀을 λ°”νƒ•μœΌλ‘œ μƒˆλ‘œμš΄ μ‚¬μ‹€μ΄λ‚˜ 결둠을 μ΄λŒμ–΄λ‚΄λŠ” 사고 κ³Όμ •μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 고양이가 생선을 λ¨ΉλŠ”λ‹€λŠ” 사싀을 μ•ˆλ‹€λ©΄, 생선을 보고 고양이가 μžˆμ„ κ°€λŠ₯성을 μΆ”λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 과학적 νƒκ΅¬λ‚˜ 문제 ν•΄κ²°μ—μ„œ 맀우 μ€‘μš”ν•œ λŠ₯λ ₯μž…λ‹ˆλ‹€."
},
{
"id": "7",
"label": "생선",
"group": 2,
"level": 2,
"description": "생선은 물속에 μ‚¬λŠ” μ²™μΆ”λ™λ¬Όλ‘œ, μ§€λŠλŸ¬λ―Έμ™€ λΉ„λŠ˜μ„ κ°€μ§€κ³  있으며 μ•„κ°€λ―Έλ‘œ μˆ¨μ„ μ‰½λ‹ˆλ‹€. λ‹€μ–‘ν•œ μ’…λ₯˜κ°€ 있으며, λ§Žμ€ 동물과 μ‚¬λžŒμ—κ²Œ μ€‘μš”ν•œ λ‹¨λ°±μ§ˆ κ³΅κΈ‰μ›μž…λ‹ˆλ‹€. κ³ μ–‘μ΄λŠ” 생선을 맀우 μ’‹μ•„ν•˜λŠ” λ™λ¬Όλ‘œ 자주 λ¬˜μ‚¬λ©λ‹ˆλ‹€."
}
],
"edges": [
{ "source": "1", "target": "2", "label": "포유λ₯˜" },
{ "source": "1", "target": "3", "label": "μ΄ˆμ‹λ™λ¬Ό" },
{ "source": "1", "target": "4", "label": "μœ‘μƒλ™λ¬Ό" },
{ "source": "1", "target": "5", "label": "영μž₯λ₯˜" },
{ "source": "2", "target": "6", "label": "κ²°κ³Ό" },
{ "source": "2", "target": "7", "label": "먹이" }
]
}
}