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

Neo4j:条件返回/IF子句/字符串操作,neo4j,cypher,Neo4j,Cypher,这是我们的继续 我正在构造一个动态匹配语句来返回层次结构&使用输出作为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 =

这是我们的继续

我正在构造一个动态匹配语句来返回层次结构&使用输出作为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,
我看到的问题是:

所属的\u将附加到我的最后一个节点


第2行:Assets我认为您需要在reduce子句中引入case语句,类似下面的代码片段。如果节点不是集合的最后一个元素,那么append theCypher有一个可以工作的子字符串函数。示例:以下是如何返回字符串的最后三个字符以外的所有字符:

return substring("hello", 0, length("hello")-3);
他回来了

因此,您可以使用子字符串修剪查询中不需要的最后一个分隔符


但我不明白你为什么要以如此复杂的方式构建你的查询;您正在使用cypher编写cypher,这是可以的,但我无法100%理解您的数据模型。在我看来,可能有更简单的方法来编写此查询。

我有多个组织的层次结构。这种关系不是固定的。。意思-如果一个组织有a->b->c,另一个可能是a->c。因此,我要做的第一件事,是根据层次结构收集层次结构信息,我试图获得属性/属性方面的详细信息,这也是不固定的。如果有一种更简单的方法,我们会非常乐意使用它。您认为我应该使用一个小数据库来存储层次结构元数据吗&从而避免第一次匹配。
return substring("hello", 0, length("hello")-3);