match/go 多Tag属性过滤

不要 return p

  • 去掉P,返回列中:v2 不包含 player125,但是在e列中包含
MATCH p=(v:player)<-[e:follow|serve*1..2]-(v2)
where id(v) == 'player100' and v2.player.name=='Tony Parker'
RETURN v,e,v2;

e 里边包含不是正常的吗
你的语句只对 v 和 v2 做了过滤,并没有对多步拓展中的点做限制

那我该如何对 对多步拓展中的点做限制 呢?

可以通过 nodes() 函数获取 intermediate nodes,然后用 list predicate expression 来做过滤,可以参考下 neo4j 社区的讨论https://community.neo4j.com/t5/neo4j-graph-platform/variable-length-paths-based-on-intermediate-nodes-as-well-as/m-p/25592

类似:
all( age in [n in nodes(p) where id(n)<>id(v) and id(n)<>id(v) | v.age] where age>30 )

1 个赞

好的,谢谢,我尝试一下

您好!我再追问一句,如果再次基础上,我想过滤指定第2跳的点的属性是不是可以这么写?
all( age in [n in nodes(p) where id(n)<>id(v) and length(p) == 2 and id(n)<>id(v) | v.age] where age>30)

上面这个(all( age in [n in nodes(p) where id(n)<>id(v) and length(p) == 2 and id(n)<>id(v2) | v.age] where age>30))是中间所有跳整体过滤。

第二跳可以直接用 变量 v2

MATCH p=(v:player)<-[e:follow|serve*1..2]-(v2)
where (length(p)==2 and v2.player.age>30) or (length(p)==1)
RETURN p

如果是某一跳中间点可能会比较复杂。

第二跳可以直接用 变量 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的起始点对象? ]

边跟点的属性比较?

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