【问题标题】:Neo4j: Link Different Nodes to the one nodeNeo4j:将不同节点链接到一个节点
【发布时间】:2018-10-11 20:47:28
【问题描述】:

假设您有以下 4 个节点:

第 1 组: (行为:“事件日志”,时间戳:3461000) (行为:“正常运行时间报告”,时间戳:3461000)

第 2 组: (行为:“事件日志”,时间戳:149100) (行为:“正常运行时间报告”,时间戳:149100)

我试图弄清楚如何将每组节点映射到一个节点。我尝试了以下 Cypher,但所有 4 个节点都仅映射到一个节点,(a)而不是创建两个(a)节点并分别映射 2 个集合。是否需要有一个条件来查找(act) 节点的匹配时间戳?那么,如果时间戳确实匹配,那么将这些节点链接到(a)?任何帮助将不胜感激。

MATCH (seconds)<-[:AT_TIME]-(act)--(obj) 
WHERE reqObj.filename IN ["6013", "6005"]
MERGE (a:Abs{name: 'SigEvent'})
CREATE (reqAct)-[:LINK]->(a)

【问题讨论】:

    标签: neo4j cypher neo4j-apoc


    【解决方案1】:

    因此,如果我理解正确,您需要一个 :Abs 节点来处理 act 节点中每个不同的时间戳。为此,我们需要按时间戳聚合动作节点(因此每个不同的时间戳只会得到一行),然后创建 :Abs 节点,然后执行 FOREACH 以创建与新节点的关系。

    MATCH (act)--(obj) 
    WHERE obj.filename IN ["6013", "6005"]
    WITH act.timestamp as timestamp, collect(DISTINCT act) as acts
    CREATE (a:Abs{name: 'SigEvent'}) // created per row, so per distinct timestamp
    FOREACH (act in acts | CREATE (act)-[:LINK]->(a))
    

    我删除了匹配模式的一部分到seconds,因为它看起来不像你在使用它。

    不过,这个查询存在一个主要问题。由于您没有在匹配模式中使用标签,因此此匹配不能使用任何索引查找,因此这是进行所有节点扫描,这将导致随着图形的增长而出现糟糕的性能。您至少需要在其中一个上贴上标签。您似乎打算在 obj.filename 上进行索引查找,因此请在您的 MATCH 模式中将适当的标签添加到 obj,以便可以使用您的索引(如果您已创建索引)。

    【讨论】:

    • 正是我想要的。谢谢,@InverseFalcon。
    猜你喜欢
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多