如果這是重複的,則排除,儘管目前爲止我沒有找到答案。java neo4j檢查是否存在關係
我有一個應用程序通過cypher語句針對REST-API創建節點和關係。我創建關係與下面的代碼:
public URI createRelationship(GraphNodeTypes sourceType, URI sourceNode,
GraphNodeTypes targetType, URI targetNode,
GraphRelationshipTypes relationshipType, String[] jsonAttributes) {
URI relationShipLocation = null;
String cypherArt = getNodeIdFromLocation(sourceNode)+"-[:"+relationshipType+"]->"+getNodeIdFromLocation(targetNode);
logger.info("creating relationship ({}:{}) -[:{}]-> ({}:{})",
sourceType,
getNodeIdFromLocation(sourceNode),
relationshipType,
targetType,
getNodeIdFromLocation(targetNode));
try {
URI finalUrl = new URI(sourceNode.toString() + "/relationships");
String cypherStatement = generateJsonRelationship(targetNode,
relationshipType,
jsonAttributes);
logger.trace("sending CREATE RELATIONSHIP cypher as {} to endpoint {}", cypherStatement, finalUrl);
WebResource resource = Client.create().resource(finalUrl);
ClientResponse response = resource
.accept(MediaType.APPLICATION_JSON)
.type(MediaType.APPLICATION_JSON)
.entity(cypherStatement)
.post(ClientResponse.class);
String responseEntity = response.getEntity(String.class).toString();
int responseStatus = response.getStatus();
logger.trace("POST to {} returned status code {}, returned data: {}",
finalUrl, responseStatus,
responseEntity);
// first check if the http code was ok
HttpStatusCodes httpStatusCodes = HttpStatusCodes.getHttpStatusCode(responseStatus);
if (!httpStatusCodes.isOk()){
if (httpStatusCodes == HttpStatusCodes.FORBIDDEN){
logger.error(HttpErrorMessages.getHttpErrorText(httpStatusCodes.getErrorCode()));
} else {
logger.error("Error {} sending data to {}: {} ", response.getStatus(), finalUrl, HttpErrorMessages.getHttpErrorText(httpStatusCodes.getErrorCode()));
}
} else {
JSONParser reponseParser = new JSONParser();
Object responseObj = reponseParser.parse(responseEntity);
JSONObject jsonResponseObj = responseObj instanceof JSONObject ?(JSONObject) responseObj : null;
if(jsonResponseObj == null)
throw new ParseException(0, "returned json object is null");
//logger.trace("returned response object is {}", jsonResponseObj.toString());
try {
relationShipLocation = new URI((String)((JSONObject)((JSONArray)((JSONObject)((JSONArray)((JSONObject)((JSONArray)jsonResponseObj.get("results")).get(0)).get("data")).get(0)).get("rest")).get(0)).get("self"));
} catch (Exception e) {
logger.warn("CREATE RELATIONSHIP statement did not return a self object, returning null -- error was {}", e.getMessage());
relationShipLocation = null;
}
}
} catch (Exception e) {
logger.error("could not create relationship ");
}
return relationShipLocation;
}
private static String generateJsonRelationship(URI endNode,
GraphRelationshipTypes relationshipType, String[] jsonAttributes) {
StringBuilder sb = new StringBuilder();
sb.append("{ \"to\" : \"");
sb.append(endNode.toString());
sb.append("\", ");
sb.append("\"type\" : \"");
sb.append(relationshipType.toString());
if (jsonAttributes == null || jsonAttributes.length < 1){
sb.append("\"");
} else {
sb.append("\", \"data\" : ");
for (int i = 0; i < jsonAttributes.length; i++) {
sb.append(jsonAttributes[i]);
if (i < jsonAttributes.length - 1){
// Miss off the final comma
sb.append(", ");
}
}
}
sb.append(" }");
return sb.toString();
}
我的問題是,我想檢查是否給定類型的給定關係的兩個節點之間已經存在PRIOR創建它。
有人可以告訴我,如何查詢關係?
隨着節點我不喜歡這樣的搭配:
MATCH cypher {"statements": [ {"statement": "MATCH (p:SOCIALNETWORK {sn_id: 'TW'}) RETURN p", "resultDataContents":["REST"]} ] }
對端點
http://localhost:7474/db/data/transaction/<NUMBER>
我將如何構建,檢查是否有關係的聲明,節點6和5或任何之間說?
由於提前,
克里斯
喜邁克爾,這個操作快到了很多關於我的。我經常試圖做的是隻在兩個節點不存在的情況下創建兩個節點之間的關係。任何將這個操作包含在neo4j api本身中的機會,或者是否已經包含這個操作的'創建,如果它不存在'? – 2015-04-27 22:09:05