对不起标题。我找不到更好的一个。我的问题很难用语言来解释,所以我试着举个例子。
说我有一个名为" FOO"和" FOO"有两个名为" id"和" bar"。
还有一个这样的图表:
(n1)-[:FOO {id: "1", bar:"8"}]->(n2)-[:FOO {id: "1", bar:"27"}]->(n3)-[:FOO {id: "1", bar:"50"}]->(n4)
(m1)-[:FOO {id: "4", bar:"2"}]->(m2)-[:FOO {id: "4", bar:"12"}]->(n2)-[:FOO {id: "4", bar:"25"}]->(m3)
(n1)-[:FOO {id: "7", bar:"11"}]->(m2)-[:FOO {id: "7", bar:"50"}]->(o3)-[:FOO {id: "7", bar:"14"}]->(o5)
等等......
我想要做的是获取关系系列的所有ID(或与这些ID相关的节点和关系)没有任何" bar"财产等于50。
在上图中,我想要的结果是第二个, id:" 4" :
(m1)-[:FOO {id: "4", bar:"2"}]->(m2)-[:FOO {id: "4", bar:"12"}]->(m3)-[:FOO {id: "4", bar:"25"}]->(m3)
另外,对于这个查询,如何获得最后一个关系栏属性不等于50的关系系列的所有id(或与这些id相关的节点和关系)。在这一个中,我想得到的是第一个和第三个, ID:" 4" 和 ID:" 7" :
(m1)-[:FOO {id: "4", bar:"2"}]->(m2)-[:FOO {id: "4", bar:"12"}]->(n2)-[:FOO {id: "4", bar:"25"}]->(m3)
(n1)-[:FOO {id: "7", bar:"11"}]->(m2)-[:FOO {id: "7", bar:"50"}]->(o3)-[:FOO {id: "7", bar:"14"}]->(o5)
答案 0 :(得分:1)
UNWIND [1, 4, 7] AS rel_id
MATCH path = () - [:FOO*3 {id:rel_id}] -> ()
WHERE NOT ANY(x IN RELATIONSHIPS(path) WHERE x.bar = '50')
RETURN path
对于数字2:
UNWIND [1, 4, 7] AS rel_id
MATCH path = () - [:FOO*3 {id: rel_id}] -> ()
WHERE NOT LAST(RELATIONSHIPS(path))['bar'] = '50'
RETURN RELATIONSHIPS(path)[0]['id']
这基本上是回答问题的最小框架。如果需要缩小可能的路径范围,可以在查询前加上其他内容,以便为要构建路径的节点或关系设置别名。
编辑:要获取所有可能的ID而不是手动传递列表,请将第一行替换为:
MATCH () - [r:FOO] - ()
WITH r.id AS r_id
WITH COLLECT(DISTINCT r_id) AS rel_ids
UNWIND rel_ids AS rel_id
答案 1 :(得分:0)
我不知道这是正确的方法,但我设法得到第一个结果,我想这样:
MATCH () - [r:FOO] - ()
WHERE r.bar = "50"
WITH COLLECT(DISTINCT r.id) as bar50_ids
MATCH () - [r:FOO] - ()
WITH COLLECT(DISTINCT r.id) as all_ids, bar50_ids
RETURN [x IN all_ids WHERE NOT(x IN bar50_ids)] AS barnot50_ids
(获取DISTINCT id,其所有关系中至少有一个.bar =“50”,并且从所有DISTINC id中得到它们的区别将给出所有没有任何关系的id包含bar =“50”)
我不知道如何获得我想要的第二。