match/go 多Tag属性过滤

第二跳可以直接用 变量 v2 这句有点不理解
p=(v)-[e1…2]-(v2) 中 v是指起始点,v2不是指路径的结束点(路径最后的点)吗?那如果v2指的第二跳,那p=(v)-[e1…2]-(v2) 是不是类似于
(v)-[e*]-(v2) 和 (v)-[e*]-(v2) -[e1*]-(v3) 的共同结果

如果路径长度为2,那 v2 不就是第二跳的终点吗?

(v)-[e*1…2]-(v2) 就是 (v)-[e]-(v2) 和 (v)-[e]-()-[e]-(v2) 的共同结果,这个语法不就是这个意思吗?

明白了,谢谢! :blush:

  • 你们的坑好多啊 :lying_face:,遍历[r in relationships(p) | startNode(r)] 时startNode拿到的只是一个Id,neo4j中可以拿到vertex,请问我如何在遍历 [r in relationships(p) | r]时拿到startNode和endNode的vertex(带属性的点对象)?
MATCH p=(v:player)<-[e:follow|serve*1..2]-(v2)
where id(v) == 'player100' and v2.player.name=='Tony Parker'
RETURN nodes(p),relationships(p),[r in relationships(p) | startNode(r)];

类似问题 MATCH 查询获取起始节点问题
可以跟一下这个 issue

1 个赞

好的,谢谢!

还是不知道怎么在这个循环里面获取点的属性 [r in relationships(p) | id(startNode(r)) ],能帮我写下吗?

[n in nodes(p)|node.prop]

你这个写法不行啊,我是想对p中的所有边进行过滤
[r in relationships(p) | #在这里有没有办法拿到r的起始点对象? ]

边跟点的属性比较?

我先自己研究一下,谢谢!

大佬,早上好!谢谢你们陪伴我一周多的调研,我总结了一下,还有3,4目标有些问题,能否帮忙解决掉,完成这次的调研工作。
我这次调研的目标,基于 match p=(v)-[e*0..3]-[v2] return p;
1,多tag的属性过滤—已ok
2,多edgeType的属性过滤—已ok
3,指定第几跳的点属性过滤—调研中
如果是某一跳中间点可能会比较复杂 能不能帮忙提供一个例子
4,指定第几跳的边属性过滤—有问题
比如:p1=v1-e1-v2-e2-v3,我通过e[1]排除掉了e2之后,p1路径就没有了,预期是
返回 p1=v1-e1-v2

如果你希望比较第几跳的边和点,可以不用变长 pattern。

MATCH p=(v)-[e1]-(v1)-[e2]-(v2)-[e3]-(v3)
RETURN p

可以直接引用 pattern 中定义的变量做属性过滤,变长 pattern 没有显式定义中间点的变量所以会比较复杂。
边过滤结果有问题,可以去主仓提个 issue,详细描述一下复现过程 https://github.com/vesoft-inc/nebula/issues

好的,谢谢!

  • 快收尾了,下面这个查询能对节点进行去重,如何在一个查询中能同时对路径p的节点和边都去重呢?
MATCH p=(v:player{name:"Tim Duncan"})-[e*0..1]-(v2)
WITH nodes(p) AS n 
# 提示报错,-1009:SemanticError: Alias `p` not defined
# WITH relationships(p) AS a
UNWIND n AS r 
WITH DISTINCT r AS r 
RETURN collect(r);

cypher 语法默认的路径模式是 点可以重复边不能重复,你通过变量 e 拿到的边不会有重复。

  • 下面的语句报错的:-1009:SemanticError: Alias used but not defined: `e’
  • RETURN collect(r),e; 不能同时返回,如何能同时返回呢?
MATCH p=(v:player{name:"Tim Duncan"})-[e*0..1]-(v2)
WITH nodes(p) AS n 
UNWIND n AS r 
WITH DISTINCT r AS r 
RETURN collect(r),e;
MATCH p=(v:player{name:"Tim Duncan"})-[e*0..1]-(v2)
RETURN toSet(nodes(p)), e

好的,非常感谢!