我正在构建一个动态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,
我看到的问题:
&#34; BELONGS_TO&#34;被附加到我的最后一个节点
第2行:资产&lt; - [:BELONGS_TO] -Anomaly **&lt; - [:BELONGS_TO] - **
是否有可用于删除它的字符串函数(我已查看过Substring ..)?或者我可以使用条件为n = cnt的CASE语句来附加&#34; BELONGS_TO&#34;?
我的最后一行仍然存在同样的问题:
第5行:Assets.name,Anomaly.name **,** - 附加&#34;,&#34;我需要消除。
感谢。
答案 0 :(得分:1)
我认为您需要在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
...
答案 1 :(得分:1)
Cypher的substring
功能可以使用basically like you'd expect。一个例子:这是你如何返回除字符串的最后三个字符之外的所有字符:
return substring("hello", 0, length("hello")-3);
(返回“他”)
因此,您可以使用substring
修剪您不想要的查询的最后一个分隔符。
但是我不明白你为什么要用如此复杂的方式构建查询;你正在使用cypher来编写cypher(这是正常的)但是(并且我不理解你的数据模型100%)在我看来,可能有一种更简单的方法来编写这个查询。