基于关系属性在Node上设置属性

时间:2016-02-01 16:50:54

标签: neo4j neo4jclient

我正在进行查询,我需要该查询的结果来影响另一个节点的属性。

return client.Cypher
            .Match("(person:Person),(me:Person)")
            .Where((Person person) => person.Email == friend)
            .AndWhere((Person me) => me.Email == username)

             //is friend, doesn't matter about relationship direction
            .OptionalMatch("(me)-[t:IS_FRIENDS_WITH{confirmed:true}]-(person)")
            .Set("person.isFriend = 'isfriend'")
            .With("person,me,t")

             //pending, I added them, we are waiting for them
            .OptionalMatch("(me)-[u:IS_FRIENDS_WITH{confirmed:false}]->(person)")
            .Set("person.isFriend = 'pending'")
            .With("person,me,t,u")


             //awaiting response, they added me, I need to respond
            .OptionalMatch("(me)<-[v:IS_FRIENDS_WITH{confirmed:false}]-(person)")
            .Set("person.isFriend = 'response'")
            .With("person,me,t,u,v")

现在,由于目前正在运行,我得到了回复#39每次都是结果,这对我编写查询的方式很有意义,但显然这不是我需要的解决方案。 任何人都可以帮助我设置这个人.IsFriend&#39;如果这个人是朋友,我们是否在等待他们回应,或者他们是否在等待我们做出回应,则可以正确变量。有点像If / Else语句,但对于客户来说。

我想返回一个Person对象(称为friend),该对象具有根据查询中的规则设置的属性isFriend,因此字符串为“朋友”,“等待”&#39;或者&#39;回复&#39; 感谢

1 个答案:

答案 0 :(得分:2)

好的,已经与更高权力人士交流并将其作为解决方案:

var query = gc.Cypher.Match("(person:Person),(me:Person)")
    .Where((Person person) => person.Email == potentialFriend)
    .AndWhere((Person me) => me.Email == username)
    .Set( @"person.isFriend = CASE 
            WHEN(me) -[:IS_FRIENDS_WITH { confirmed: true}]-(person)THEN 'isFriend'
            WHEN(me) -[:IS_FRIENDS_WITH { confirmed: false}]->(person)THEN 'pending'
            WHEN(me) < -[:IS_FRIENDS_WITH { confirmed: false}]-(person)THEN 'response'
            END")
    .Return(person => person.As<Person>());