cypher实践之获取路径中name属性最短的那个节点

来源:互联网 发布:看图软件apk 编辑:程序博客网 时间:2024/05/21 03:19

首先 获取一个路径p。那么很容易写出:

match (n:mechword{name:'生物工程'}),(m:mechword{name:'现代化'})with n,m match p=shortestPath((n)-[r*..]-(m)) return p;

这句cypher的意思是找到名字为“生物工程”和名字为“现代化”的mechword节点间最短路径。这里的最短路径可能不是一条,有可能是多条。但是这里假设只返回了一条路径p。

要想求出名字最短的那个节点我们想到的是用min()函数来达到目的。min()函数的功能是返回最小值,那么我们调用min(length(node.name))就可以找到最短名字的长度了。但是node怎么得到呢,很容易想到nodes(p),用 这个函数返回nodes,但是nodes(p)返回的是一个list<node>而min()是一个聚合函数,注意它的参数并不是list类型而是int float或者string 等“单类型” 。所以我们要用到一个关键字unwind,unwind的作用就是将list“打散”,他能将一个数组转化为一行一行的数据。将上面的只是结合起来得到最短名字的长度:

match (n:mechword{name:'生物工程'}),(m:mechword{name:'现代化'})with n,m match p=shortestPath((n)-[r*..]-(m)) unwind nodes(p) as nn with  min(length(nn.name))as a    return a

得到了最短名字的长度(a=3)那么在找到那些名字长度和a相等的就ok啦!那么继续加长cypher语句得到:

match (n:mechword{name:'生物工程'}),(m:mechword{name:'现代化'})with n,m match p=shortestPath((n)-[r*..]-(m)) unwind nodes(p) as nn with nn,min(length(nn.name))as a  with a, nn where length(nn.name)=a  return nn.name;

语句返回的结果为 三行 分别为“现代化” “一般问题” “生物工程” 很明显返回的结果是错误的。很奇怪返回了三个值,而且长度不一致。这是怎么回事呢,那么再返回下a看看a还是不是3.

match (n:mechword{name:'生物工程'}),(m:mechword{name:'现代化'})with n,m match p=shortestPath((n)-[r*..]-(m)) unwind nodes(p) as nn with nn,min(length(nn.name))as a  with a, nn where length(nn.name)=a  return nn.name,a;

结果返回的是[“现代化” ,3][“一般问题”,4][ “生物工程”,4]也就是说a不在是最短名字的长度了。和之前的结果我们发现我们似乎不能把nn with 到最后 否则得不到我们想要的结果。那怎么办呢?很简单再创造一个nn。得到下面的cypher。

match (n:mechword{name:'生物工程'}),(m:mechword{name:'现代化'})with n,m match p=shortestPath((n)-[r*..]-(m)) unwind nodes(p) as nn with unwind nodes(p)as mm,min(length(nn.name))as a  with a, mm where length(mm.name)=a  return mm.name;

这样写执行的时候有问题,因为 unwind不能紧跟with。那在做一下改变

match (n:mechword{name:'生物工程'}),(m:mechword{name:'现代化'})with n,m match p=shortestPath((n)-[r*..]-(m)) unwind nodes(p) as nn with p,min(length(nn.name))as a  unwind nodes(p) as mm  with mm where length(mm.name)=a  return mm.name;

这样大功告成!返回了“现代化”三个字。