H all,我有一个neo4j数据库,每个节点都是一条带有用户信息的推文。我必须在每条推文中使用提及建立一个社交网络。相关属性是user_name和tweet_user_mention。我的策略:
示例:
*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?
谢谢大家。
我已编辑了我的问题。更清楚?
答案 0 :(得分:1)
我假设您在创建节点时知道“提及”,因为您设置了一个或多个“提及属性”。你能不能创建关系呢?
如果您需要先设置属性然后再创建关系,请仅使用一个属性,但让它成为一个数组。将属性展平为mention_1
,mention_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的关系。