我是Neo4j的新手,我正在使用REST API来创建节点和关系。我有两个节点NA和NB,它们与一个关系RC连接。 'NA - RC - NB'。在创建节点和关系之前,我检查节点及它们之间的关系是否不存在。我弄清楚如何检查一个节点是否存在,并且正在努力解决如何检查两个节点之间是否存在关系的问题。我想出了这个Cypher查询。
"start x = node(*), n = node(*)
match x-[r]->n
where (x.name? = {from} and type(r) = {rtype} and n.name? = {to})
return ID(r), TYPE(r)"
节点有一个属性'name'。当我执行这个查询时,我得到空的'data:[]'。
有什么建议吗?我试着查看Neo4j文档和一些教程,但不太清楚这一点。
TIA
这是java代码:
/** Check if a relationship exists between two nodes */
public boolean relationshipExists(String from /** node name */
, String to /** node name */
, String type) {
boolean exists = false;
/** check if relationship exists */
String url = "http://localhost:7474/db/data/cypher";
JSONObject jobject = new JSONObject();
try {
Map<String, String> params = new HashMap<String, String>();
params.put("from", from);
params.put("rtype", type);
params.put("to", to);
String query = "start x = node(*), n = node(*) match x-[r]->n where (x.name? = {from} and type(r) = {rtype} and n.name? = {to}) return ID(r), TYPE(r)";
jobject.put("query", query);
jobject.put("params", params);
} catch (JSONException e) {
logger.error("Error", e);
}
String response = sendQuery(url, jobject.toString());
try {
jobject = new JSONObject(response);
JSONArray data = (JSONArray) jobject.get("data");
JSONArray next = null;
for (int index = 0; index < data.length(); index++) {
next = data.getJSONArray(index);
if (!next.isNull(1) && next.getString(1).equalsIgnoreCase(type)) {
exists = (next.getInt(0) > -1) ? true : false;
}
}
} catch (JSONException e) {
logger.error("Error", e);
}
return exists;
}
答案 0 :(得分:1)
type参数列为{type}
,但在参数映射中定义为"rtype"
。这样可以解决吗?您可以尝试不带参数的查询(只需硬编码),看看它是否有效。
答案 1 :(得分:0)
也许你可以使用RELATE命令使它与众不同: http://docs.neo4j.org/chunked/1.8.M03/query-relate.html
这样就不需要检查关系是否已经存在。简单地说,如果没有,那么它会创建一个。