使用cypher查找,分组和计算Neo4J中的关系

时间:2016-10-24 04:48:03

标签: neo4j cypher

您好我在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

的确切示例数据

1 个答案:

答案 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)

创建likesperformed关系后,我们现在可以像这样(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)开始,并通过likesperformed边缘导航到执行交互的每个用户。然后,它会导航到这些用户的其他互动(同样,通过likesperformed边缘),这会以表示帖子(matched)的节点结束。 matched节点的数量与COUNT method聚合并返回,以及页面名称属性。

相关建议:标签名称应以大写字母开头,应为单数,即PostInteractionUser