Yasmeen
Yasmeen

Reputation: 819

Neo4j : Passing Relationship as a query parameter

I have created the following query which works fine when i am passing all the relationship.

@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);

but i want to fetch data for specific action like the query below

@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);

But this does not work and i get the following error.

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

I think this is not a correct way to pass param in relationship. Is there a way how i can achieve this.

Upvotes: 1

Views: 967

Answers (2)

Michael Hunger
Michael Hunger

Reputation: 41676

  1. you should not use start n=node(*) in your query use a label like :Profile and an index/unique constraint on :Profile(id)

    MATCH (profile:Profile) WHERE profile.id = {profileId}

  2. you can't use rel-types as parameters directly but you can check the type of your relationship, e.g. against a set of names that is passed in

either

WHERE type(rel) = {action}

or

WHERE type(rel) IN {actions}

Upvotes: 5

Christophe Willemsen
Christophe Willemsen

Reputation: 20185

There is no way currently to pass relationship types nor labels as query parameters.

You will need to handle it in your application, when building the query string.

Here is a simple example in PHP :

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

Upvotes: 2

Related Questions