Neo4j:将关系作为查询参数传递

时间:2014-12-29 13:46:29

标签: java neo4j

我创建了以下查询,当我传递所有关系时,该查询正常工作。

@Query(value="START profile=node(*) "
                + "MATCH profile - [rel:create | stream | like | follow] - feeds "
                + "WHERE profile.id ={profileId} "
                + "WITH distinct feeds as feed, rel.date as date "
                + "ORDER BY date DESC "
                + "RETURN DISTINCT feed;")
    public List<Feed> findByProfileId(@Param("profileId") String profileId);

但我想获取特定操作的数据,如下面的查询

@Query(value="START profile=node(*) "
                + "MATCH profile - [rel:{action}] - feeds "
                + "WHERE profile.id ={profileId} "
                + "WITH distinct feeds as feed, rel.date as date "
                + "ORDER BY date DESC "
                + "RETURN DISTINCT feed;")
public List<Feed> findByProfileId(@Param("action") String action,@Param("profileId") String profileId);

但是这不起作用,我得到以下错误。

org.neo4j.rest.graphdb.RestResult Exception: Invalid input '{': expected whitespace or an identifier

我认为这不是在关系中传递param的正确方法。 有没有办法如何实现这一目标。

2 个答案:

答案 0 :(得分:5)

  1. 您不应在查询中使用start n=node(*):Profile

    上使用:Profile(id)等标签和索引/唯一约束

    MATCH(个人资料:个人资料)WHERE profile.id = {profileId}

  2. 您不能直接使用rel-types作为参数,但您可以检查您的关系类型,例如针对在

  3. 中传递的一组名称

    或者

    WHERE type(rel) = {action}
    

    WHERE type(rel) IN {actions}
    

答案 1 :(得分:2)

目前无法将关系类型和标签作为查询参数传递。

在构建查询字符串时,您需要在应用程序中处理它。

以下是PHP中的一个简单示例:

$relTypes = array(':FACEBOOK_PROFILE',':TWITTER_PROFILE');
$relString = implode('|', $relTypes);
$q = 'MATCH (n:User)-['.$relString.']->(profile)';