【问题标题】:Structuring output for nodes in Neo4jNeo4j中节点的结构化输出
【发布时间】:2014-10-24 11:22:01
【问题描述】:

我是 neo4j 的新手,正在学习电影示例。我一直在尝试做 Kevin Bacon 和 Meg Ryan 查询之间的经典最短路径,但也改变了列的输出。下面的查询有两种不同的方法。第一列我不明白为什么它不起作用。所以我有两个问题。

  1. 从依赖于的节点输出属性的最佳方式是什么 路径中的节点类型?
  2. 如何混合输出以实现 输出为演员名称、关系、电影名称、关系 演员姓名。我可以在不使用路径但挣扎时做到这一点 处理路径。

查询返回尝试示例:

MATCH p=shortestPath(
    (bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
)

    RETURN 
        [n in nodes(p) | case when labels(n) = 'Person' then n.name when labels(n) = 'Movie' then n.title end ],
        [a in nodes(p) where has(a.name) | a.name],
        [b in nodes(p) where has(b.title) | b.title]

由此产生的输出是(抱歉,不能张贴图片)

  1. null,null,null,null
  2. 凯文·培根、汤姆·克鲁斯、梅格·瑞恩
  3. 几个好人,壮志凌云

首选输出凯文培根,几个好男人,汤姆克鲁斯,壮志凌云,梅格瑞恩

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    硬编码的解决方案是使用COALESCE():

    MATCH p=shortestPath(
        (bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
    )    
    RETURN EXTRACT(x IN NODES(p) | COALESCE(x.name, x.title))
    

    输出:

    Kevin Bacon, A Few Good Men, Tom Cruise, Top Gun, Meg Ryan

    但这只是因为我们知道 Movie 节点没有 name 属性。如果他们出于某种原因这样做......

    MATCH (m:Movie) SET m.name = "Something Unrelated"
    

    那么上面会失败,我们会得到:

    Kevin Bacon, Something Unrelated, Tom Cruise, Something Unrelated, Meg Ryan

    所以更通用的解决方案是:

    MATCH p=shortestPath(
        (bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
    )    
    RETURN EXTRACT(
        x IN NODES(p) | CASE WHEN x:Person THEN x.name
                             WHEN x:Movie  THEN x.title
                        END
    )
    

    你的尝试

    [n in nodes(p) | case when labels(n) = 'Person' then n.name when labels(n) = 'Movie' then n.title end ]

    真的很接近,但是LABELS()返回一个集合,所以你需要检查一个字符串是IN LABELS(),而不是LABELS()等于一个字符串。

    【讨论】:

    • 'Person' IN LABELS(x) 可以这样表达更简洁:x:Person
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    相关资源
    最近更新 更多