我有一个简单的关系测试,我试图使用Rest API(java-rest-binding)https://github.com/neo4j/java-rest-binding来创建一个独特的节点但不幸的是我被困在某事上,这里是详细信息:(非独特的节点和关系工作得非常好,它没有这个,很可能是我做了一些天真的事(请原谅我对neo4j的了解不足)。
final UserModel userModel = new UserModel();
final HashMap<String, Object> uModelAttributes = new HashMap<String, Object>(0);
uModelAttributes.put("name", "AnirudhVyas");
userModel.setAttributes(uModelAttributes);
final HashSet<Action> buyHistory = new HashSet<Action>();
final Action buyAction = new Action();
final ProductModel productModel = new ProductModel();
final HashMap<String, Object> attributes = new HashMap<String, Object>(0);
attributes.put("name", "mercedes benz ");
attributes.put("make", "mercedes benz");
attributes.put("model", "sls 550");
attributes.put("year", "2014");
productModel.setAttributes(attributes);
buyAction.setProduct(productModel);
buyHistory.add(buyAction);
userModel.setBuyHistory(buyHistory);
System.out.println("Before");
new UserModelDAO().createCompleteTree(userModel);
System.out.println("Completed >>>
如果我在dao上使用它:
final RestNode root = api.getOrCreateNode(api.index().forNodes("users", MapUtil.stringMap(IndexManager.PROVIDER, "lucene", "type", "fulltext")), "name", m
.getAttributes().get("name"), m.getAttributes());
api.getOrCreateNode(api.index().forNodes("products", MapUtil.stringMap(IndexManager.PROVIDER, "lucene", "type", "fulltext")), "name", buyAction.getProduct().getAttributes().get("name"), buyAction.getProduct().getAttributes()), RelationshipTypes.BOUGHT);
这基本上失败了:
java.lang.RuntimeException: Error retrieving or creating node for key name and value AnirudhVyas with index users
at org.neo4j.rest.graphdb.ExecutingRestAPI.getOrCreateNode(ExecutingRestAPI.java:448)
at org.neo4j.rest.graphdb.RestAPIFacade.getOrCreateNode(RestAPIFacade.java:223)
at xxxx.xxxx.xxxx.graph.UserModelCreateTasteKeyNeo4JBatchCallback.recordBatch(UserModelCreateTasteKeyNeo4JBatchCallback.java:61)
答案 0 :(得分:0)
我通过不使用批处理休息回调解决了这个问题 - 当我简单地使用 - getOrCreateXXX()for RestAPI时,它就像一个魅力 - 需要进一步调查为什么在BatchCallback上的getOrCreate#recordBatch()将表现不同。
答案 1 :(得分:0)
有几种方法可以做到,其中一种方法是使用Cypher:
MATCH a
WHERE a.name! = 'nameTofound'
CREATE UNIQUE a-[:Relationship]-c:LABEL
RETURN c
在queryEngine中使用它。 它就像一个魅力,请查看以下链接了解更多详情: http://docs.neo4j.org/chunked/milestone/query-create-unique.html
Java代码在这里:
protected static RestNode createOrGetExistingNode(String key, String valueFor, String Rel, String label){
RestNode node = null;
final QueryResult<Map<String, Object>> result = GraphRestService.queryEngine.query(String.format("MATCH node WHERE node.%s! ='%s' " +
"CREATE UNIQUE node-[:%s]-c:%s RETURN c" , key, valueFor, Rel, label), MapUtil.map("reference", 0));
for (Map<String, Object> column : result) {
node = (RestNode) column.get("c");
}
return node;
}