Java'dan Neo4J'de cypher parametresinde sorun yaşıyorum. Katıştırılmış veritabanını çalıştırıyorum.Neo4J'de, Java'dan bir cypher sorgusunda etiketin nasıl parametre olarak ayarlanacağı?
kod böyle olmalı (GraphDB.cypher ExecutionEngine doğrudan gider)
HashMap<String, Object> parameter = new HashMap<>();
parameter.put("theLabel1", "Group");
parameter.put("theRelation", "isMemberOf");
parameter.put("theLabel2", "Person");
GraphDB.cypher("MATCH (n1:{theLabel1})-[r:{theRelation}]->(n2:{theLabel2}) RETURN n1, r, n2", parameter);
ancak bu istisna
Exception in thread "main" Invalid input '{': expected whitespace or a label name (line 1, column 11)
"MATCH (n1:{theLabel1})-[r:{theRelation}]->(n2:{theLabel2}) RETURN n1, r, n2"
belgeleri (ve öğretici) biten kullanmak söyler Parametreleri kapsayacak şekilde {}, ancak bu özellikler için de cypher json notasyonu olarak kullanılır. @See http://docs.neo4j.org/chunked/milestone/tutorials-cypher-parameters-java.html
GraphDB.cypher("MATCH (n:" + labelName + ")-[r:" + relationName + "]->...
hedefi etiketi değiştirebilir ve ben istediğim için bu gereklidir, bu sorunu çözmek yerine (diğer şablon yöntemleri veya birlikte) böyle sorgu dizesi oluşturmak için başka bir yolu var mı Kodu tamamen yeniden kullanmak için.
Şimdiden teşekkürler.
[[aldıktan sonra düzenlenen bir (iç) HAYIR CEVAP] AS] parametresinin bu form şu anda (2014,6) desteklenmediği
, hemen sorgu göndermeden önce küçük bir Replacer çalışacaktır.
HashMap<String, Object> parameter = new HashMap<>();
parameter.put("theLabel1", "Group");
parameter.put("theRelation", "isMemberOf");
parameter.put("theLabel2", "Person");
parameter.put("aName", "Donald Duck");
GraphDB.cypher("MATCH (n1:#theLabel1#)-[r:#theRelation#]->(n2:#theLabel2#) WHERE n2.Name = {aName} RETURN n1, r, n2", parameter);
... with ...
public static ExecutionResult cypher(String query, Map<String, Object> params) {
for (String key : params.keySet()) {
query = query.replaceAll("#" + key + "#", String.valueOf(params.get(key)));
}
return params == null ? cypherEngine.execute(query) : cypherEngine.execute(query, params);
}
Ben şu anda desteklenmemektedir korkuyorum daha readble
Eh, fakat bu özelliklerin bu tür sağlamak için Neo4j kapsam dışında biraz öyle, yapma sence? – Rolf
@Raxa, çözümünüz "değiştirici" ile çok ilginç. İlk bakışta, "# theLabel1 #" kullanımınız statik görünüyor, bu nedenle Cypher 'label'' '' '' 'parametresi '' nin dinamik olarak belirtilmesiyle ilgili gerçek meseleyi ele almadı. Ancak "parametre" deki eşlemenin yerini alacak bir yer tutucu olarak düşünüldüğünde, dinamik olarak "etiket" kelimesini geçmeyi başarır.Herhangi bir standart çözüm olup olmadığından emin değilsiniz, ancak bu oldukça ilginç bir azaltmadır. – Causality