0

我有一个节点列表,代表用户形成的事件历史,以下模式:

()-[:s]->()-[:s]->()等等

列表的每个节点都属于一个用户(通过关系连接)。

我正在尝试创建单个用户历史记录(在为特定用户发生的所有事件之间添加 :succeeds_for_user 关系,以便每个事件只有一个连续事件)。

我试图做这样的事情来提取应该存在关系的节点:

start u = node:class(_class = "User")
match p = shortestPath(n-[:s*..]->m), n-[:belongs_to]-u-[:belongs_to]-m
where n <> m
with n, MIN(length(p)) as l
match p = n-[:s*1..]->m
where length(p) = l  
return n._id, m._id, extract(x IN nodes(p): x._id)

但它非常缓慢。

有谁知道更好的方法吗?

4

1 回答 1

1

Neo4j 在那里计算了很多最短路径。

假设您有一个历史开始节点(出于我查询的目的,有 id x),您可以获得具有相应用户 id 的事件节点的有序列表,如下所示:

"START n=node(x) # history start
 MATCH p = n-[:FOLLOWS*1..]->(m)<-[:DID]-u  # match from start up to user nodes
 return u._id,
     reduce(id=0, 
            n in filter(n in nodes(p): n._class != 'User'): n._id) 
     # get the id of the last node in the path that is not a User 
     order by length(p) # ordered by path length, thus place in history"

然后,您可以在程序中迭代结果并添加属于同一用户的节点之间的关系。我没有合适的大数据集,但它可能会更快。

于 2013-06-11T20:33:06.770 回答