Cypher - 在属性中按字符串聚合节点

时间:2014-02-21 01:28:43

标签: java twitter neo4j cypher

H all,我有一个neo4j数据库,每个节点都是一条带有用户信息的推文。我必须在每条推文中使用提及建立一个社交网络。相关属性是user_name和tweet_user_mention。我的策略:

  1. 获取所有节点。
  2. 对于每个节点,获取用户名并在查询中使用它以获取一组节点在tweet_user_mention中具有该字符串
  3. 在节点之间创建定向边。
  4. 示例:

    *username to search: (node: {user_name: 'goofy' [...]})
    *query -> match (n) where (tweet_user_mention: 'goofy') return n; get all nodes that mention 'goofy'.
    *create links.
    

    我试图提出的问题是节点可能有多个提及,我不知道如何在不知道多少提及的情况下查询多个提及。

    现在节点可以有:

    1 mention
    tweet_user_mention_0: 'goofy'
    
    3 mentions
    tweet_user_mention_0: 'goofy_0'
    tweet_user_mention_1: 'goofy_1'
    tweet_user_mention_2: 'goofy_2'
    ...
    n mentions
    tweet_user_mention_n: 'goofy_n'
    

    最好是连接字符串并将它们保存在这样的单个属性中吗?

    3 mentions
    tweet_user_mentions: 'goofy_0 goofy_1 goofy_2'
    How could it be the query? have I to user regex in cypher?
    

    谢谢大家。

    我已编辑了我的问题。更清楚?

2 个答案:

答案 0 :(得分:1)

我假设您在创建节点时知道“提及”,因为您设置了一个或多个“提及属性”。你能不能创建关系呢?

如果您需要先设置属性然后再创建关系,请仅使用一个属性,但让它成为一个数组。将属性展平为mention_1mention_2等等是一件很痛苦的事情,因为在Cypher中动态处理属性名称是不可能的(或者至少非常不方便)。使用regexp也很不方便,容易出错且速度慢。在这种情况下,最好使用字符串数组。然后,您可以在FOREACH子句中循环遍历数组属性的值,或者使用IN匹配数组中的各个值。缺点是标签索引目前不支持数组,如果你在tweet_user_mention数组中进行多次查找,这可能会使你的事情变得非常缓慢。我认为索引很快就会支持数组/集合,但我不适用于Neo4j,所以不要相信我的话。

将'mentions'作为字符串数组,你可以做类似这样的事情

//CREATE
CREATE (:User {username: 'goofy1'}), (:User {username: 'goofy2'})
, (:Tweet {tweet_user_mention: ['goofy0', 'goofy1']})

//MATCH all tweets and make sure they have relationships to the users they mention
MATCH (t:Tweet)
FOREACH (user_mentioned IN (t.tweet_user_mention) | 
    MERGE (mentioned:User {username:user_mentioned})
    MERGE t-[:MENTIONS]->mentioned
)

//MATCH tweets mentioning specific username and merge the relationship to that user
MATCH (t:Tweet)
WHERE 'goofy0' IN t.tweet_user_mention
MERGE (u:User {username: 'goofy0'})
MERGE t-[:MENTIONS]->u

答案 1 :(得分:0)

您可以将提及建模不是作为属性而是作为关系。然后,您只需选择指定类型的所有关系。

让用户和推文成为节点的类型。然后,例如,user1可以具有类型Author与tweet节点#1的关系,而tweet#1可以具有类型Mentions与user2的关系。