您好 - 我正在寻找有关cypher查询的帮助,该查询没有返回问题“哪个板是node1固定到哪个取决于哪个用户登录?”的预期结果。
为user2获取了错误的结果。我预计OPTIONAL MATCH将“捕获”user2成为可以访问该板的工作组的成员。
我尝试了几种不同的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
答案 0 :(得分:0)
U1
和U3
有CREATES
关系,但U2
(对于user2
)没有 - 所以你的第二个MATCH
永远不会匹配U2
。
另外,正如@WilliamLyon所说,您需要在查询中使用workgroup
而不是workGroup
。但修复它不足以使您的查询工作。
答案 1 :(得分:0)
结束使用UNION MATCH而不是OPTIONAL MATCH。有关更多信息,请参阅http://neo4j.com/docs/stable/query-union.html
感谢大家的帮助和建议。欢呼声。