【问题标题】:How to return single node with Multiple match for different labels in neo4j?如何为neo4j中的不同标签返回具有多个匹配的单个节点?
【发布时间】:2017-12-17 09:34:31
【问题描述】:

我正在使用 neo4j 3.2.x。我要做的是编写一个查询,该查询将更新两个节点(用户和性别)之间的关系,并返回具有从关系中提取的 InterestedInGender 属性作为数组的单个用户节点。下面的查询存在问题,因为它现在返回多个记录,其中为interestingInGender 提供了单个值。关系已正确创建,但在返回数据时会返回多条记录。我只想返回用户节点。有什么方法可以修复此查询以仅返回单个用户节点。

MATCH (u:User {_id:"1234"}) 
MATCH (ig:Gender) WHERE ig.value IN ["male", "female"]
WITH u, ig
OPTIONAL MATCH (u)-[igr:INTERESTED_IN_GENDER]->()
DELETE igr
with u, ig
MERGE (u)-[:INTERESTED_IN_GENDER]->(ig)
RETURN u{
  ._id,
  interestedInGender: [(u)-[:INTERESTED_IN_GENDER]->(ig:Gender) | ig.value]
}

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您获得多条记录(行)的原因是因为您的 ig 匹配到性别匹配到两个 :Gender 节点...两行,其中两行具有相同的 u 节点,但不同的 ig节点。该基数会在您的其余查询中保持不变,因此您会返回两行。

    在 MERGE 关系之后,您需要将 u 的基数缩减回 1,因此在 MERGE 之后但在 RETURN 之前添加:

    WITH distinct u
    

    【讨论】:

    • 我最终这样做了MATCH (u:User {_id:"1234"}) WITH u OPTIONAL MATCH (u)-[igr:INTERESTED_IN_GENDER]->() DELETE igr with u UNWIND ["male", "female"] AS igender MATCH (g:Gender {value: igender}) MERGE (u)-[:INTERESTED_IN_GENDER]->(g) with u, collect(g) as genders RETURN u{ ._id, interestedInGender: [(u)-[:INTERESTED_IN_GENDER]->(iig:Gender) | iig.value] }
    • 我也尝试过 WITH distinct u,它确实返回了单个结果,但 InterestInGender 的值是单个值。
    猜你喜欢
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多