【问题标题】:Neo4j first node to meet relationship in a movie modelNeo4j 第一个在电影模型中满足关系的节点
【发布时间】:2014-09-24 05:34:08
【问题描述】:

我已经阅读了 Neo4j 手册并看到了许多关于电影图的简短示例。我也在本地安装了它并使用了密码。

设置如下: 我有以下节点:电影(带有名称和 ID,由朋友拥有)、演员(带有名称和 ID)、导演(带有名称和 ID)、类型(带有 ID 和名称)

关系是:电影中的演员(一部电影 - 许多演员),导演导演一部电影(每部电影一名导演,但导演可以导演多部电影),电影有多种类型“(多对多)

1) 归朋友所有,我不知道为什么,但是按照 LOAD CSV 示例,他们将 USA 作为节点而不是属性,但是有一个合乎逻辑的理由为什么最好将其作为节点而不是像我一样的属性?

2) 我要搜索的内容类似于此问题的答案: Nearest nodes to a give node, assigning dynamically weight to relationship types

但是 - 我不重视这种关系,它更像是“去寻找与之相连的第一个给定节点”

鉴于“朋友所有”只能由1个人拥有。

如果给定电影名称“蜘蛛侠”(例如,目的归弗兰克所有),则查找约翰拥有的下一部电影。

所以看了Neo4j之后,我相信我不需要指定需要遍历哪个关系,而是去寻找下一部符合我标准的电影,对吧?

所以按照上面的链接

MATCH (n:Start { title: 'Spider-Man' }),
  (n)-[:CONNECTED*0..2]-(x)
RETURN x

所以去节点蜘蛛侠,只要它连接就去找我X,但我得到*0..2的树桩,因为它的范围......如果我只是说“你先去找我这意味着约翰自己的”

3) 跟进 #2 - 我如何插入“john 拥有”的 fitler?

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:

    您的问题中有很多内容不太合理。这是一个答案。

    1) 如果您想根据国家/地区进行搜索,将“美国”设为节点而不是属性会很有用。如果“美国”是一个节点,您可以从“美国”节点开始限制搜索。如果你不介意这样做,那么这并不重要。它还可以为较长的国家/地区名称节省少量空间,以便将名称存储一次并通过关系链接到它。

    2) 您的示例与您描述的图表不匹配。如果没有更好的例子,我真的无法谈论它。

    3) 一旦你改进了你的例子,这可能很容易回答。


    好的。根据答案的 cmets,这就是您所需要的。找到一部约翰拥有的电影,它通过共同的演员、导演等与弗兰克拥有的电影蜘蛛侠相连(即像 (movie)(movie) 这样的子图)你可以写:

    MATCH (n:Movie {title : 'Spider-Man', owned_by : 'Frank'})<-[*2]->(m:Movie {owned_by : 'John'})
    RETURN m LIMIT 1
    

    如果您想要更多响应,请更改或删除 RETURN 子句上的 LIMIT。如果你想允许像 (movie)(movie)(movie) 这样的链通过链,你可以增加匹配关系的数量(* 2) 到 4、6、8 等。您可能不应该只将 MATCH 子句的关系部分写为 -[*]-,因为这可能会陷入无限循环。

    【讨论】:

    • 你从这个例子中具体理解了什么?让我试着这样表述:“如果我有一个名为 tag 的属性,它是电影节点的一部分,并且我有 3 个将电影节点联系在一起的关系,如果给定电影的起点(即电影名称) 找到具有给定标签的第一对节点的正确密码是什么。问题是,如果我有 300K 电影节点条目并且我有 50K 节点,标签 = 1 只有什么是最有效的方法找到第一个标签=1的节点,给出名称=“给定的搜索标题”。这样更容易理解吗?
    • 让我试着陈述这个问题。从给定的电影开始,如何找到具有特定属性值并通过演员或导演与给定电影相关的电影?对吗?
    • 通过给定的 X 关系。这些关系来自演员和导演,但从长远来看,它可以扩展到作家、制片人……。但你或多或少是对的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多