在Neo4j中为节点构建输出

时间:2014-10-24 11:22:02

标签: neo4j

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

  1. 从依赖于的节点输出属性的最佳方法是什么 路径中的节点类型?
  2. 如何混合输出来实现     输出为演员姓名,人际关系,电影名称,关系     演员姓名。我不是在使用路径时可以做到这一点,但在何时挣扎     处理路径。
  3. 使用示例返回尝试进行查询:

    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. Kevin Bacon,Tom Cruise,Meg Ryan
    3. 少数好人,Top Gun
    4. 首选输出Kevin Bacon,A Few Good Men,Tom Cruise,Top Gun,Meg Ryan

1 个答案:

答案 0 :(得分:2)

硬编码解决方案是使用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()等于字符串。