Neo4j:条件 return/IF clause/String 操作
Neo4j: Conditional return/IF clause/String manipulation
这是
的延续
我正在为 return 层次结构构造一个动态 MATCH 语句,并将输出用作 Neo4j JDBC 输入以从 java 方法查询数据:
MATCH p=(:Service)<-[*]-(:Anomaly)
WITH head(nodes(p)) AS Service, p, count(p) AS cnt
RETURN DISTINCT Service.company_id, Service.company_site_id,
"MATCH srvhier=(" +
reduce(labels = "", n IN nodes(p) | labels + labels(n)[0] +
"<-[:BELONGS_TO]-") + ") WHERE Service.company_id = {1} AND
Service.company_site_id = {2} AND Anomaly.name={3} RETURN " +
reduce(labels = "", n IN nodes(p) | labels + labels(n)[0] + ".name,");
输出结果如下:
MATCH srvhier=(Service<-[:BELONGS_TO]-Category<-[:BELONGS_TO]-SubService<-
[:BELONGS_TO]-Assets<-[:BELONGS_TO]-Anomaly<-[:BELONGS_TO]-) WHERE
Service.company_id = {1} and Service.company_site_id = {21} and
Anomaly.name={3} RETURN Service.name, Category.name, SubService.name,
Assets.name, Anomaly.name,
我遇到的问题:
"BELONGS_TO" 附加到我的最后一个节点
第 2 行:资产<-[:BELONGS_TO]-异常**<-[:BELONGS_TO]-**
是否有可用于删除它的字符串函数(我看过 Substring..)?或者我可以使用带有条件 n=cnt 的 CASE 语句来附加 "BELONGS_TO"?
我的最后一行仍然存在同样的问题:
第 5 行:Assets.name,Anomaly.name**,** - 我需要删除的附加“,”。
谢谢。
我认为您需要在 reduce 子句中引入 case 语句,类似于下面的代码片段。如果节点不是集合的最后一个元素,则附加 "<-[:BELONGS_TO]-"
关系。如果它是最后一个元素,则不要附加它。
...
reduce(labels = "", n IN nodes(p) |
CASE
WHEN n <> nodes(p)[length(nodes(p))-1] THEN
labels + labels(n)[0] + "<-[:BELONGS_TO]-"
ELSE
labels + labels(n)[0]
END
...
Cypher 有一个 substring
有效的函数 basically like you'd expect。一个例子:下面是你如何 return 除了字符串的最后三个字符之外的所有内容:
return substring("hello", 0, length("hello")-3);
(即 returns "he")
因此您可以使用 substring
到 trim 您不想要的查询的最后一个分隔符。
但我不明白您为什么要以如此复杂的方式构建查询;您正在使用 cypher 来编写 cypher(这没问题)但是(而且我 100% 不理解您的数据模型)在我看来可能有一种更简单的方法来编写此查询。
这是
我正在为 return 层次结构构造一个动态 MATCH 语句,并将输出用作 Neo4j JDBC 输入以从 java 方法查询数据:
MATCH p=(:Service)<-[*]-(:Anomaly)
WITH head(nodes(p)) AS Service, p, count(p) AS cnt
RETURN DISTINCT Service.company_id, Service.company_site_id,
"MATCH srvhier=(" +
reduce(labels = "", n IN nodes(p) | labels + labels(n)[0] +
"<-[:BELONGS_TO]-") + ") WHERE Service.company_id = {1} AND
Service.company_site_id = {2} AND Anomaly.name={3} RETURN " +
reduce(labels = "", n IN nodes(p) | labels + labels(n)[0] + ".name,");
输出结果如下:
MATCH srvhier=(Service<-[:BELONGS_TO]-Category<-[:BELONGS_TO]-SubService<-
[:BELONGS_TO]-Assets<-[:BELONGS_TO]-Anomaly<-[:BELONGS_TO]-) WHERE
Service.company_id = {1} and Service.company_site_id = {21} and
Anomaly.name={3} RETURN Service.name, Category.name, SubService.name,
Assets.name, Anomaly.name,
我遇到的问题:
"BELONGS_TO" 附加到我的最后一个节点
第 2 行:资产<-[:BELONGS_TO]-异常**<-[:BELONGS_TO]-**
是否有可用于删除它的字符串函数(我看过 Substring..)?或者我可以使用带有条件 n=cnt 的 CASE 语句来附加 "BELONGS_TO"?
我的最后一行仍然存在同样的问题:
第 5 行:Assets.name,Anomaly.name**,** - 我需要删除的附加“,”。
谢谢。
我认为您需要在 reduce 子句中引入 case 语句,类似于下面的代码片段。如果节点不是集合的最后一个元素,则附加 "<-[:BELONGS_TO]-"
关系。如果它是最后一个元素,则不要附加它。
...
reduce(labels = "", n IN nodes(p) |
CASE
WHEN n <> nodes(p)[length(nodes(p))-1] THEN
labels + labels(n)[0] + "<-[:BELONGS_TO]-"
ELSE
labels + labels(n)[0]
END
...
Cypher 有一个 substring
有效的函数 basically like you'd expect。一个例子:下面是你如何 return 除了字符串的最后三个字符之外的所有内容:
return substring("hello", 0, length("hello")-3);
(即 returns "he")
因此您可以使用 substring
到 trim 您不想要的查询的最后一个分隔符。
但我不明白您为什么要以如此复杂的方式构建查询;您正在使用 cypher 来编写 cypher(这没问题)但是(而且我 100% 不理解您的数据模型)在我看来可能有一种更简单的方法来编写此查询。