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

Java Cypher-按属性中的字符串聚合节点,java,twitter,neo4j,cypher,Java,Twitter,Neo4j,Cypher,总之,我有一个neo4j数据库,每个节点都是一条包含用户信息的tweet。我必须利用每条推文中提到的内容建立一个社交网络。相关属性是user_name和tweet_user_title。我的策略: 获取所有节点。 对于每个节点,获取用户名并在查询中使用它,以获取一组在tweet\u user\u中包含该字符串的节点 在节点之间创建定向边。 例如: *username to search: (node: {user_name: 'goofy' [...]}) *query -> match

总之,我有一个neo4j数据库,每个节点都是一条包含用户信息的tweet。我必须利用每条推文中提到的内容建立一个社交网络。相关属性是user_name和tweet_user_title。我的策略:

获取所有节点。 对于每个节点,获取用户名并在查询中使用它,以获取一组在tweet\u user\u中包含该字符串的节点 在节点之间创建定向边。 例如:

*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?
谢谢大家


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

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


让user和tweet成为if节点的类型。然后,例如,user1可以与tweet节点1具有类型Author的关系,tweet 1可以与user2具有类型references的关系。

我假设您在创建节点时知道“references”,因为您设置了一个或多个“reference属性”。那么,你能不能不只是建立关系

如果需要先设置属性,然后创建关系,请仅使用一个属性,但将其设置为数组。将属性扁平化为类似于提_1、提_2等是一种痛苦,因为在Cypher中,动态处理属性名称是不可能的,或者至少是非常不方便的。使用regexp也不方便、容易出错且速度慢。在这种情况下,最好使用字符串数组。然后,可以在FOREACH子句中循环数组属性的值,或者将数组中的各个值与中的匹配。缺点是标签索引目前不支持数组,如果你在tweet\u user\u-antify数组中进行多次查找,这可能会使事情变得非常缓慢。我认为索引很快就会支持数组/集合,但我不为Neo4j工作,所以不要相信我的话

使用“提及”作为字符串数组,您可以执行类似这样的操作

//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

我还想使用tweet作为用户之间的边缘属性。我正在使用twitter4j和一个监听器通过流式api收集推文。在捕获tweet时也很难创建关系,因为接下来我必须测试用户是否存在于数据库中,然后创建边缘。如果没有,请创建一个空节点,如果我在另一条推文中找到他,请更新它。。嗯。。我认为最好是听标签,收集推文,在停止时创建边缘和可能的空节点,比如没有交互的用户,但只提到。