【问题标题】:Neo4j Cypher relationship existis and collection of IDsNeo4j Cypher 关系存在和 ID 集合
【发布时间】:2017-09-08 11:50:37
【问题描述】:

我有以下 Neo4j Cypher 查询,用于检查 Userentity 之间是否存在关系并返回布尔结果:

MATCH (u:User) WHERE u.id = {userId} MATCH (entity) WHERE id(entity) = {entityGraphId} RETURN EXISTS( (u)<-[:OWNED_BY]-(entity) )

请帮助重写此查询,以便能够接受{entityGraphIds} 的集合而不是单个{entityGraphId},并检查User 和具有这些{entityGraphIds} 的任何实体之间是否存在关系。

例如,我有user1entity1entity2user1entity2 有关系。我将通过{user.id}{userId}{entity1.id, entity2.id}{entityGraphIds} 这样查询应该返回true。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    我相信您可以简单地使用IN operator。考虑这些参数:

    :params {userId: 1, entityGraphIds : [2,3,4]}
    

    然后,查询:

    MATCH (u:User) WHERE u.id = {userId}
    MATCH (entity) WHERE id(entity) IN ({entityGraphIds})
    RETURN EXISTS( (u)<-[:OWNED_BY]-(entity) )
    

    编辑:

    如果您尝试在 :User 连接到至少 1 个实体时返回 true,那么您可以将查询简化为:

    OPTIONAL MATCH (u:User)<-[:OWNED_BY]-(entity:Entity)
    WHERE u.id = {userId} AND id(entity) IN ({entityGraphIds})
    RETURN u IS NOT NULL
    

    【讨论】:

    • 感谢您的回答。一旦我会测试它,我会在这里更新。
    • 非常感谢!第二个查询工作得非常好。感谢您一直以来的帮助!!!
    • 我很抱歉,但我在这个(第二个)查询中发现了一个问题 - “结果不是预期的大小。预期为 1 行,但找到 2'。当用户拥有 2 个或更多实体时会出现此错误。
    • 返回 'RETURN count(u) > 0' 是否正确?
    • @alexanoid 您使用的是哪个版本的 neo4j?我正在使用此初始数据集 create (user:User {id : 1}) create (e1:Entity {id : 2}) create (e2:Entity {id : 3}) create (e3:Entity {id : 4}) create (user)&lt;-[:OWNED_BY]-(e1) create (user)&lt;-[:OWNED_BY]-(e2) 和此查询 OPTIONAL MATCH (u:User)&lt;-[:OWNED_BY]-(entity:Entity) WHERE u.id = {userId} AND entity.id IN ({entityGraphIds}) RETURN u IS NOT NULL 运行 3.2.1。
    猜你喜欢
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多