gpt4 book ai didi

java neo4j 检查关系是否存在

转载 作者:行者123 更新时间:2023-12-04 21:29:19 26 4
gpt4 key购买 nike

如果这是重复的则排除,尽管到目前为止我还没有找到答案。

我有一个应用程序,它通过针对 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();
}

我的问题是我想在创建之前检查两个节点之间是否已经存在给定类型的给定关系。

有人可以告诉我,如何查询关系吗???

对于节点,我会像这样进行 MATCH:

 MATCH  cypher {"statements": [ {"statement": "MATCH (p:SOCIALNETWORK {sn_id: 'TW'} ) RETURN p", "resultDataContents":["REST"]} ] } 

针对端点

 http://localhost:7474/db/data/transaction/<NUMBER>

我将如何构造语句来检查关系,比如节点 6 和 5 之间或其他什么?

提前致谢

克里斯

最佳答案

你可能想考虑通过密码来做到这一点,并使用 MERGE/ON CREATE/ON MATCH关键字。

例如,您可以这样做:

create (a:Person {name: "Bob"})-[:knows]->(b:Person {name: "Susan"});

MATCH (a:Person {name: "Bob"}), (b:Person {name: "Susan"})
MERGE (a)-[r:knows]->(b)
ON CREATE SET r.alreadyExisted=false
ON MATCH SET r.alreadyExisted=true
RETURN r.alreadyExisted;

我在此处提供的这个MATCH/MERGE 查询将返回 true 或 false,具体取决于关系是否已经存在。

此外,FWIW 看起来您用于通过 StringBuilder 对象累积 JSON 的代码可能很笨重且容易出错。有很多不错的库,例如 Google GSON这将为您执行 JSON,因此您可以创建 JSON 对象、数组、基元等——然后让库负责将其正确序列化为字符串。这往往会使您的代码更简洁、更易于维护,并且当您弄乱 JSON 格式时(我们都这样做),比累积这样的字符串更容易找到。

关于java neo4j 检查关系是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27233978/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com