【问题标题】:Neo4J - Choose MATCH statement based on node property valueNeo4J - 根据节点属性值选择 MATCH 语句
【发布时间】:2019-12-04 13:32:22
【问题描述】:

我正在尝试根据初始节点的属性在特定路径上进行 MATCH。

例如我有一个节点n,它有一个名为nodeType 的属性。如果节点类型为A,则使用第一个 MATCH,如果节点类型为B,则使用第二个 MATCH。

我已经尝试过使用FOREACH。因此,当 nodeType 为 A 的情况下,则返回该节点及其与其他节点的关系。如果返回类型为B,则返回其与其他节点的关系。在这种情况下,它只能是一个或另一个,因此只有一个会返回结果。但是,这可能是我的语法错误,但是我要求它执行 MATCH 查询时,我无法在 FOREACH 中定义变量。

任何帮助都会很棒。

MATCH (n: testNode) 
WITH n
FOREACH(_ IN CASE WHEN n.nodeType == "A" THEN [MATCH (n)-[r]-(n2: testNode)] ELSE [] END | WITH n, r, n2)
FOREACH(_ IN CASE WHEN n.nodeType == "B" THEN [MATCH (n)--(n0)-[r]-(n2: testNode)] ELSE [] END | WITH n, r, n2)
WITH n, r, n2
RETURN n, COLLECT(r), COLLECT(n2)

注意:这不是我的 MATCH 查询的实际语义。我让它们不同只是为了表明它们会做不同的事情,但返回相同类型的节点和关系。

【问题讨论】:

    标签: graph neo4j properties match


    【解决方案1】:

    这样的东西符合您的需要吗?

    顺便说一句...在您使用n.nodeType == "B" 的示例中,您将返回r,但您在查询中没有匹配它。我在下面的示例中使用了不同的关系类型。

    MATCH (n:testNode)
    RETURN 
      CASE 
        WHEN n.nodeType = "A" THEN [(n)-[r:REL1]-(n2:testNode)| {n:n, r: type(r), n2: n2}] 
        WHEN n.nodeType = "B" THEN [(n)-[r:REL2]-(n2:testNode)| {n:n, r: type(r), n2: n2}] 
      END AS nodes
    

    【讨论】:

    • 啊,所以我在第二个语句中错过了 r。我的实际匹配语句更长,并且确实包含 r。我可以更新那个。我会尝试您的建议并检查它是否适用于我的问题。另外,如果你很好奇,我在最近的问题中寻找另一种做同样事情的方法。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多