一 Neo4j的連接
在這里因為需要依賴Neo4j的部分jar包,所以我們使用Maven來管理各種依賴包。
首先創建一個Maven項目,並在maven項目中的pom.xml中引入
1 <dependency> 2 <groupId>org.neo4j.driver</groupId> 3 <artifactId>neo4j-java-driver</artifactId> 4 <version>1.1.2</version> 5 </dependency>
在java中代碼如下即可以連接到Neo4j數據庫:
1 import org.neo4j.driver.v1.*; 2 3 import static org.neo4j.driver.v1.Values.parameters; 4 5 Driver driver = GraphDatabase.driver( "bolt://localhost:7687",AuthTokens.basic( "neo4j", "neo4j" ) ); 6 Session session = driver.session(); 7 8 //現在已經連接上,創建一個新節點 9 session.run( "CREATE (a:Person {name: {name}, title: {title}})", 10 parameters( "name", "Arthur", "title", "King" ) );
二 設計問題類別
經過貝葉斯分類計算后可以將問題分為幾類規范問題,所以需要創建幾類規范問題。
二 創建連接並實現問題接口
在之前句子還原之后將提供一個ArrayList<String>類型的數據,ArrayList作為一個長度可變的數據,可確保每次可以傳入不同數量的String數據。在ArrayList中,第一個存放問題類型,第二個開始存放關鍵詞(nm電影名,nr演員名,ng類型名)。
所以我們在這部分設計為兩個類,一個為main類(之后結合到查詢控制器中);另一個為數據訪問類,用來存放各種具體方法來訪問Neo4j數據庫。
1.main類
先定義ArrayList(String)來存放傳入參數。在主函數中寫一個ArrayList的add方法來進行之后的測試。將傳入的ArrayList賦值給本類的ArrayList,即reStrings然后調用receive()方法。
創建一個receive()方法,在其中先獲取到傳入的ArrayList的第一個數據作為問題類型。
int modelIndex = Integer.valueOf(reStrings.get(0));
然后通過一個switch()case:的方法,由不同的問題類型,調用不同的方法。但是總的來說可以分為兩類:返回為單值參數,返回為多值參數。
(1)單值返回
在case后,首先獲取到reStrings里的第二個參數,即為關鍵詞。然后調用其相關的方法獲得查詢結果,如果查詢結果不為空則賦值給answer。
1 title = reStrings.get(1); 2 String releaseDate = questionRepository.getMovieReleaseDate(title); 3 if (releaseDate != null) { 4 answer = releaseDate; 5 } else { 6 answer = null; 7 } 8 System.out.println(answer); 9 break;
(2)多值返回
同樣在case之后獲取到reStrings中的第二個參數,為關鍵詞。然后通過相關的方法查詢獲得查詢結果,但是不同的是返回值為多個參數。所以在賦值給answer時也需要注意多值賦值,先判斷返回值的數量是不是非零,非零的話將返回數據轉換為String類型然后賦值給answer。
1 title = reStrings.get(1); 2 List<String> types = questionRepository.getMovieTypes(title); 3 if (types.size() == 0) { 4 answer = null; 5 } else { 6 answer = types.toString().replace("[", "").replace("]", ""); 7 } 8 System.out.println(answer); 9 break;
2. questionRepository類
該類是用來與數據庫進行連接,創建不同的方法從而使不同類型的問題可以按需訪問數據庫並獲取數據。
首先先訪問數據庫並創建一個訪問數據庫的實例。
1 static Driver driver = GraphDatabase.driver( "bolt://localhost:7687", AuthTokens.basic( "neo4j", "123456" ) ); 2 static Session session = driver.session();
其中傳入參數不是本地數據庫的7474端口,查閱后發現7474是http端口,而bolt端口是8687。
然后就在類中創建不同問題的不同方法,同樣問題可以大概分為三類:單值返回,多值返回和多值輸入
(1)單值返回查詢
方法中傳入參數為關鍵詞,然后調用session訪問數據庫的實例中訪問對應的數據。如下就是在m:Movie中匹配,條件為n.title為title,並且返回電影標題n.title和上映時間n.releasedate,其中將傳入的tetle賦值給查詢條件中的title。
其中result.next()是查詢記錄的下一條,result.hasnext是一個布爾值,判斷記錄是否還有下一條。所以返回記錄的下一條,獲取記錄中的releasedate屬性並轉換為string類型。
1 public static String getMovieReleaseDate(String title) { 2 StatementResult result = session.run( "match(n:Movie) where n.title={title}" + 3 " return n.title as title,n.releasedate as releasedate", 4 parameters( "title", title ) ); 5 return result.next().get("releasedate").asString(); 6 }
(2)多值返回查詢
多值返回方法的返回參數也是一個List<String>類型,如下,在查詢中查詢連接表,查詢條件為n.title為title值,返回電影類型名稱。
因為返回值是一個list<string>類型,所以新建返回參數ans為該類型,然后進行一個while循環,當result.hasnext為真時,表示還有下一條記錄,則繼續循環。在循環中,將記錄一條一條的通過ans.add()加入到在返回參數ans中。
1 public static List<String> getMovieTypes(String title) { 2 StatementResult result = session.run( "match(n:Movie)-[r:is]->(b:Genre) where n.title={title}" + 3 " return n.title as title,b.name as name", 4 parameters( "title", title ) ); 5 List<String> ans = new ArrayList(); 6 while(result.hasNext()) 7 { 8 Record record = result.next(); 9 ans.add(record.get("name").asString()); 10 } 11 return ans; 12 }
(3)多值輸入
除了以上兩種,還有一種多值輸入的情況,如“nr這個演員演過的ng類型電影有什么?”這種情況下,關鍵詞就有兩個,分別是演員nr和電影屬性ng。這個問題的返回值也是多值,所以返回情況和上面的(2)多值返回情況相同,不同是在查詢中是通過多值查詢。
在查詢中有兩個條件查詢語句結合在一起,並且將兩個傳入分別付給查詢語句的name和gname中。既可以實現多值輸入的查詢工作。
1 public static List<String> getActorMoviesByType(String name,String gname) { 2 StatementResult result = session.run( "match(n:Person)-[:actedin]-(m:Movie) where n.name={name}" + 3 "match(g:Genre)-[:is]-(m) where g.name=~{gname}"+ 4 " return n.name as name,m.title as title", 5 parameters( "name", name,"gname",gname) ); 6 List<String> ans = new ArrayList(); 7 while(result.hasNext()) 8 { 9 Record record = result.next(); 10 ans.add(record.get("title").asString()); 11 } 12 return ans; 13 }
這樣就可以通過main來判斷問題的類型,由不同的問題類型進行調用不同的questionRepository中的對應方法,來對Neo4j數據庫進行相關的查詢並返回數據。目前先將數據返回答應在控制台上。