【发布时间】:2016-03-02 19:35:23
【问题描述】:
您好 – 我正在寻求有关密码查询的帮助,该查询未返回问题“node1 固定到哪些板,具体取决于哪个用户登录?”的预期结果?
为 user2 获得了错误的结果。我希望 OPTIONAL MATCH 会“抓住”用户 2 成为可以访问董事会的工作组成员。
我尝试了 MATCH 语句、UNION 等的几种不同组合。
谢谢 - 杰夫
我在http://console.neo4j.org/ 中使用以下查询创建了一个图表:
CREATE (N1:node { name:"node1" })-[:PINNED_TO]->(B1:board { name:"board1" }),(N1)-[:PINNED_TO]->(B2:board { name:"board2" }),(N1)-[:PINNED_TO]->(B3:board { name:"board3" })
CREATE (U1:user { name:"user1" })-[:CREATES]->(B1),(U1)-[:CREATES]->(B2),(U3:user { name:"user3" })-[:CREATES]->(B3)
CREATE (B1)-[:CAN_VIEW]->(V1:view { name:"creator" }),(B2)-[:CAN_VIEW]->(V2:view { name:"creator AND workgroup" }),(B3)-[:CAN_VIEW]->(V3:view { name:"everyone" })
CREATE (U2:user { name:"user2" })-[:MEMBER_OF]->(WG2:workgroup { name:"B2 workgroup" })-[:CAN_ACCESS]->(B2)
然后我使用以下内容查询图表(将 user.name 替换为每个用户):
MATCH (n:node)-[p:PINNED_TO]->(b:board)
MATCH (v:view)<-[:CAN_VIEW]-(b)<-[:CREATES]-(logged_in_user: user)
WHERE v.name = 'everyone' OR logged_in_user.name='user2'
OPTIONAL MATCH (b)<-[can_access:CAN_ACCESS]-(wg:workgroup)<-[:MEMBER_OF]-(logged_in_user)
WHERE logged_in_user.name='user2' OR can_access IS NOT NULL
RETURN DISTINCT logged_in_user.name, n.name, type(p), b.name
如果“user1”已登录,我正确得到以下信息:
logged_in_user.name n.name type(p) b.name
user1 node1 PINNED_TO board1
user1 node1 PINNED_TO board2
user1 node1 PINNED_TO board3
如果“user2”已登录,我错误地得到以下信息:
logged_in_user.name n.name type(p) b.name
user2 node1 PINNED_TO board3
它应该已经返回:
logged_in_user.name n.name type(p) b.name
user2 node1 PINNED_TO board2
user2 node1 PINNED_TO board3
如果“user3”已登录,我正确得到以下信息:
logged_in_user.name n.name type(p) b.name
user3 node1 PINNED_TO board3
【问题讨论】:
-
不确定这是否是问题,但
workgroup节点标签有两种不同的情况:CREATE 语句中的workgroup和 MATCH 中的workGroup,因为标签不匹配区分大小写。 -
感谢您的关注。但是,正如@cybersam 所提到的,这不足以解决问题,因为 user2 与 board2 没有传出关系。我希望 OPTIONAL MATCH 会“抓住”它,但它失败了,我将在查询的那部分尝试更多的节点规范。还有其他想法吗?