Neo4j Query - 一个属性与另一个属性分组的关系中的值不等于的关系

时间:2016-09-19 11:49:28

标签: neo4j cypher

对不起标题。我找不到更好的一个。我的问题很难用语言来解释,所以我试着举个例子。

说我有一个名为" 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)

2 个答案:

答案 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”)

我不知道如何获得我想要的第二