根据其他关系排除节点

时间:2017-11-14 19:27:13

标签: neo4j cypher

我正在尝试获得同时为app.get('/proxy', (req, res) => { request('http://example.com/').pipe(res); }); :USER帐户的用户和帐户的结果,这些帐户与任何其他帐户之间没有:ADMIN关系。

背景

这为我提供了既不是父帐户也不是子帐户的帐户:

:PARENT

这为我提供了所有用户与帐户之间也有MATCH (a: Account) WHERE NOT (a)-[:PARENT]-() RETURN a 关系的帐户:

:ADMIN

问题:

尝试将两者结合使用时,我的结果中仍然会显示MATCH (u)-[:ADMIN]-(a)-[:USER]-(u) RETURN a, u 个关联的帐户:

:PARENT

这就像第2行的MATCH (u)-[:ADMIN]-(a)-[:USER]-(u) WHERE NOT (a)-[:PARENT]-() RETURN u, a 没有任何效果。可能会显示不需要的帐户,因为它们与第一个WHERE匹配,但是从此处我想排除所有具有MATCH关系的帐户。

我尝试了什么

我一直在尝试使用:PARENTOPTIONAL MATCH关键字,并根据条件的不同顺序和变体进行匹配。上面的三个片段是我最接近描述它出错的地方。

我想象的另一种解决方法可能是

WITH

我得到的结果太少了。它遗漏了几个没有任何MATCH (a: Account) OPTIONAL MATCH (a)-[p:PARENT]-() WITH a, p WHERE p IS NULL OPTIONAL MATCH (u)-[relu: USER]-(a)-[rela: ADMIN]-(u) with u, a, relu, rela WHERE NOT relu IS NULL AND NOT rela IS NULL RETURN a, u 关系的帐户,但仍然拥有与该帐户有:PARENT:USER关系的用户。

似乎我错过了如何聚合查询的重要观点。

1 个答案:

答案 0 :(得分:2)

(这个答案正在进行中。)

我创建了一个小示例数据集:

CREATE
  (a:Account {name: 'acc1'}),
  (u:User {name: 'user1'}),
  (u)-[:ADMIN]->(a),
  (u)-[:USER]->(a)

此查询似乎有效。与您的第三个查询的唯一区别是添加了:Account

MATCH (u)-[:ADMIN]-(a:Account)-[:USER]-(u)
WHERE NOT (a)-[:PARENT]-()
RETURN u, a