Neo4j-Driver(java)處理數組查詢條件

Neo4j庫中數據:


需求:查詢符合條件的一些人名實體信息


1) 正常的傳入語句

match (n:Person) where n.name in ["Bob","Ada"] return n

2) Java中直接使用字符串數據進行拼接的語句

match (n:Person) where n.name in [Bob,Ada] return n 

在Cypher語法中,第一種情況是對屬性值當做條件進行查詢,可以正常的得到結果;第二種情況,數組中的信息在Cypher中被當做實體自身的<id>信息,不會返回正確的結果。 

解決方法:


  1. 自己規整拼接格式
    ArrayList<String> List_reset = new ArrayList<>();
    // List 爲原始數據集
    for (String string : List ) {
                List_reset .add("'" + string + "'");
            }

     

  2. 利用Neo4j自身方法

    import static org.neo4j.driver.v1.Values.parameters;
     
    String cypherString = "match (n:Person) where n.name in {List} return n";
           
    StatementResult rs = session.run(cypherString,parameters("List",List));

    Parameters中處理的方式是通過Values.value方法進行處理,追到最源頭你會發現他把數組裏的值取出來一個個進行了StringValue(String val)方法,通過重寫的toString方法將數據返回,你會驚奇的發現也是通過拼接的方式進行操作

    public static Value value(String val) {
            return new StringValue(val);
        }
    
                     ||
                    \  /
                     \/
    public StringValue(String val) {
            if (val == null) {
                throw new IllegalArgumentException("Cannot construct StringValue from null");
            } else {
                this.val = val;
            }
        }
                     ||
                    \  /
                     \/
    
    // Neo4j Values重寫了toString方法 
    public String toString() {
        return String.format("\"%s\"", this.val.replace("\"", "\\\""));
    }

     

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章