@@ -14,32 +14,38 @@ public class CypherQueryGenerator {
1414
1515 public String generate (String userQuestion ) {
1616 String prompt = """
17- 당신은 Neo4j 그래프 데이터베이스에서 정보를 추출하기 위한 Cypher 쿼리를 생성하는 AI입니다.
18-
19- - 주어진 질문에서 핵심 개념과 연관된 개념들을 찾아야 합니다.
20- - 질문에 포함된 키워드와 의미적으로 밀접한 노드 쌍 간의 관계(triple)를 추출해야 합니다.
21- - 반드시 관계 중심 구조 (시작 노드, 관계 라벨, 도착 노드)를 반환하는 Cypher 쿼리를 작성하세요.
22- - 관계나 노드에 포함된 설명 문장 중 하나를 함께 반환하세요. (r.sentence → 없으면 a.includeSentence → 없으면 b.includeSentence 순으로)
23- - 반환 항목은 다음과 같아야 합니다:
24- sourceLabel, relationLabel, targetLabel, sentence, nodeLabel
25- - 코드는 반드시 Cypher 쿼리 한 줄만 출력하며, 코드블록이나 설명은 포함하지 마세요.
17+ 당신은 Neo4j 그래프 데이터베이스에서 정보를 추출하는 Cypher 쿼리를 생성하는 AI입니다.
18+
19+ - 사용자 질문에 포함된 복합 명사(예: "지구형 행성")는 의미 단위로 분리해서,
20+ 해당 단어 각각이 포함된 노드도 함께 탐색할 수 있도록 쿼리를 작성하세요.
21+ - 예를 들어 "지구형 행성과 관련된 개념"이라면,
22+ "지구형", "행성", "지구형 행성" 모두를 쿼리 조건에 포함해야 합니다.
23+ - 관계(triple)는 (시작 노드)-[관계]->(도착 노드) 형식으로 추출하세요.
24+ - 설명 문장도 함께 조회하세요. (r.sentence → a.includeSentence → b.includeSentence)
25+ - 반환 항목:
26+ sourceLabel, relationLabel, targetLabel, sentence, nodeLabel
27+ - 코드는 Cypher 한 줄만 출력하며, 설명이나 코드블록 없이 작성하세요.
28+ - LIMIT은 5로 설정하세요.
29+
30+ 예시 질문: 지구형 행성과 관련된 개념들을 알려줘
31+ →
32+ MATCH (a:GraphNode)-[r:RELATED]-(b:GraphNode)
33+ WHERE
34+ toLower(a.label) =~ '.*지구형.*' OR toLower(b.label) =~ '.*지구형.*' OR
35+ toLower(a.label) =~ '.*행성.*' OR toLower(b.label) =~ '.*행성.*' OR
36+ toLower(a.label) =~ '.*지구형 행성.*' OR toLower(b.label) =~ '.*지구형 행성.*'
37+ RETURN
38+ a.label AS sourceLabel,
39+ r.label AS relationLabel,
40+ b.label AS targetLabel,
41+ COALESCE(r.sentence, a.includeSentence, b.includeSentence, "") AS sentence,
42+ a.label AS nodeLabel
43+ LIMIT 5
44+
45+ 질문: "%s"
46+ →
47+ """ .formatted (userQuestion );
2648
27- 예시:
28- 질문: "고래와 관련된 개념들을 알려줘"
29- →
30- MATCH (a:GraphNode)-[r:RELATED]-(b:GraphNode)
31- WHERE toLower(a.label) CONTAINS toLower('고래') OR toLower(b.label) CONTAINS toLower('고래')
32- RETURN
33- a.label AS sourceLabel,
34- r.label AS relationLabel,
35- b.label AS targetLabel,
36- COALESCE(r.sentence, a.includeSentence, b.includeSentence, "") AS sentence,
37- a.label AS nodeLabel
38- LIMIT 15
39-
40- 질문: "%s"
41- →
42- """ .formatted (userQuestion );
4349
4450 return openAIService .getCompletionResponse (
4551 List .of (new ChatMessage ("user" , prompt )),
0 commit comments