neo4j cypher节点之间的多种关系

时间:2013-12-26 05:51:14

标签: neo4j

例如:

  

a- [r] - > b,两个节点之间有多个r,每个r.userId都是唯一的。
  (例如:a- [r:R {userId:“user1”}] - > b,(a- [r:R {userId:“user2”}] - > b,
  对于a- [r] - > c

也是如此

情况是a- [r] - > b有一个关系:r.userId = amdin,但a- [r] - > c没有这种关系。

我怎么才能返回c。

我尝试创建密码:

  

“MATCH(a:SomeLabel) - [r:SomeR] - >(any:SomeLabel)”
  “WHERE id(a)= 0 AND r.userId<> \”admin \“”
    “返回任何”;

但这也会返回b,因为a-> b有其他关系:r.userId = xxxx

如何编写密码来返回节点而不是inculde user.Id =“admin”......

如果您不清楚我的意思,请告诉我....我需要您的帮助...谢谢

我在下面画了一张图片,多个关系名为sr但具有不同的属性(userId是唯一的), 我想找到与节点A相关的所有节点,但不包含sr {userId:admin},我在那里添加一个红色下划线。因此,如图所示,节点B具有sr {userId:admin}的关系,所以我只想返回节点C,没有节点B

enter image description here

2 个答案:

答案 0 :(得分:6)

为了显示图形问题的简单表示,graphgists非常有用,因为人们可以探索数据。 我根据您的描述创建了一个:http://gist.neo4j.org/?94ef056e41153b116e4f

对于您的问题,您可以收集每对节点关系中涉及的所有用户名,并根据这些用户名进行过滤:

MATCH (a { name:'A' })-[r:sr]->b
WITH a,b, collect(r.name) AS usernames
WHERE NOT 'admin' IN usernames
RETURN a, b

答案 1 :(得分:0)

你的问题很不清楚。我的解释是,您希望找到未与类型为c关系的节点a相关联的节点R

你基本上想做一个负面的匹配,也就是搜索一个不存在的模式。可以使用where not

检索否定模式
MATCH (a:SomeLabel), (c:SomeLabel)
WHERE ID(a)=0 AND NOT (a)-[:R]->(c)
RETURN c

这将返回未连接到SomeLabel的所有a个节点的列表。

请参阅参考手册中的http://docs.neo4j.org/chunked/stable/query-where.html#query-where-patterns