Neo4j cypher查询找出连接的节点

时间:2017-04-24 07:42:30

标签: java neo4j

我已经给出了这样的查询

WITH ['1000Anthem.txt','1007AW.txt','100Art.txt'] as NDS 
UNWIND RANGE(0, size(NDS)-2) as i 
UNWIND RANGE(i+1, size(NDS)-1) as j 
WITH NDS, NDS[i] as N1, NDS[j] as N2 
MATCH path = (N1)-[*]-(N2) 
WHERE length(path)+1 <=size(NDS) 
 AND ALL(n in nodes(path) WHERE n in NDS) 
RETURN path    

我收到以下错误

  

类型不匹配:N1已使用冲突类型String定义   (预期节点)(第2行,第15列(偏移:224))&#34; MATCH路径=   (N1) - [*] - (N2)WHERE长度(路径)+1&lt; = size(NDS)AND ALL(n in   节点(路径)NDS中的位置)RETURN路径&#34;

1 个答案:

答案 0 :(得分:1)

您的N1和N2变量绑定到列表中的字符串。

之后的MATCH试图将它们用作节点,这是不可能的。字符串不是节点。

如果要查找其中一个属性等于字符串的节点,则需要使用不同的方法,为节点使用不同的变量,并在WHERE子句中使用谓词来仅过滤节点节点的属性等于字符串。

修改

您还没有提供这些节点应该是什么,没有标签和非描述性变量名称的任何上下文,所以我只是做一个疯狂的猜测,并说这些是标记的节点:文件,属性为name

在查询开始时查找和收集节点将类似于:

WITH ['1000Anthem.txt','1007AW.txt','100Art.txt'] as NDS 
MATCH (f:File)
WHERE f.name in NDS
WITH collect(f) as NDS
...

如果您有索引:文件(名称),则索引将用于加速查找。此时您的NDS变量将是节点集合而不是字符串集合,因此查询的其余部分在语法上是正确的。