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>信息,不會返回正確的結果。
解決方法:
- 自己規整拼接格式
ArrayList<String> List_reset = new ArrayList<>(); // List 爲原始數據集 for (String string : List ) { List_reset .add("'" + string + "'"); }
-
利用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("\"", "\\\"")); }