您好我在neo4j 3.03中有两套标签: -
INTERACTIONS
uidpid 100000060085836_170782808933_10154454374183934
name Dean Hohaia
postid 170782808933_10154454374183934
pageid 170782808933
userid 100000060085836
POSTS
shares 0
comments 0
postid 100129044360_100138063361365
pageid 100129044360
type link
createdtime 2010-03-30 00:43:23
pagename Study in New Zealand
likes 4
我有一个名为LIKES的关系,它的创建方式如下: -
MATCH (i:interactions),(p:posts)
WHERE i.userid = p.userid
CREATE (i)-[:likes]->(p)
看起来像这样:
uidpid 613637235481924_125251397514429_1000501533322740
name Toth Mariann
postid 125251397514429_1000501533322740
pageid 125251397514429
userid 613637235481924
基本上与交互相同。
我需要找到一种方法来创建一个显示以下内容的查询: -
对于帖子中的每个页面名称,按页面名称显示用户ID交互的计数: -
Source Pagename Matched Pagename Userids count #
Air New Zealand Rialto Channel 12494
Air New Zealand RNZ 2979
Air New Zealand SKY TV 4651
实质上 - 对于帖子中的每个页面名称,显示每个用户参与的所有其他页面的计数。
我是否需要创建任何其他关系才能实现此目标?
以下是我用作CSV https://www.wetransfer.com/downloads/37e89c65f029344a2205ca717f04b6fe20161024051807/0d4ab3
的确切示例数据答案 0 :(得分:1)
首先,如您所述,我们根据postid
(1)连接互动和帖子。
MATCH (i:interactions), (p:posts)
WHERE i.postid = p.postid
CREATE (i)-[:likes]->(p)
然后我们为每个用户创建一个节点(2):
MATCH (i:interactions)
WITH DISTINCT i.userid AS userid
CREATE (u:user {userid: userid})
并将它们连接到交互(3):
MATCH (u:user), (i:interactions)
WHERE u.userid = i.userid
CREATE (u)-[:performed]->(i)
可以使用单个CREATE
执行这两个MERGE
操作(2和3),但性能似乎要差得多 - 不确定原因。
MATCH (i:interactions)
MERGE (u:users {userid: i.userid})-[:performed]->(i)
创建likes
和performed
关系后,我们现在可以像这样(4)制定查询:
MATCH (source:posts)<-[:likes]-(:interactions)<-[:performed]-(:users)-[:performed]->(:interactions)-[:likes]->(matched:posts)
RETURN source.pagename, matched.pagename, COUNT(matched)
LIMIT 10
警告:这需要两分钟才能在我的笔记本电脑上运行(2011年末的四核i7 CPU + SSD)。
查询从帖子(source
)开始,并通过likes
和performed
边缘导航到执行交互的每个用户。然后,它会导航到这些用户的其他互动(同样,通过likes
和performed
边缘),这会以表示帖子(matched
)的节点结束。 matched
节点的数量与COUNT
method聚合并返回,以及页面名称属性。
相关建议:标签名称应以大写字母开头,应为单数,即Post
,Interaction
和User
。