Neo4j:条件返回/ IF子句/字符串操作

时间:2015-02-27 21:18:53

标签: neo4j cypher

这是Neo4j: Listing node labels

的延续

我正在构建一个动态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;我需要消除。

感谢。

2 个答案:

答案 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%)在我看来,可能有一种更简单的方法来编写这个查询。