【问题标题】:Neo4j Cypher query need help getting expected responseNeo4j Cypher 查询需要帮助以获得预期的响应
【发布时间】: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 会“抓住”它,但它失败了,我将在查询的那部分尝试更多的节点规范。还有其他想法吗?

标签: neo4j cypher


【解决方案1】:

U1U3 有一个传出的CREATES 关系,但U2(对于user2)没有——所以你的第二个MATCH 永远不会匹配U2

另外,正如@WilliamLyon 所说,您需要在查询中使用workgroup 而不是workGroup。但是解决这个问题并不足以使您的查询正常工作。

【讨论】:

  • 知道了。我明白为什么它失败了。我将在查询的那部分尝试更多的节点规范。关于如何“抓住” board2 的任何想法?
【解决方案2】:

最终使用 UNION MATCH 而不是 OPTIONAL MATCH。更多信息请见http://neo4j.com/docs/stable/query-union.html

感谢大家的帮助和建议。干杯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    相关资源
    最近更新 更多