Neo4j - 在列表中的节点之间添加额外的关系

时间:2013-06-11 15:33:25

标签: performance neo4j cypher

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

()-[:s]->()-[:s]->()依此类推

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

我正在尝试创建单个用户历史记录(在特定用户发生的所有事件之间添加:succeeded_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)

但是它很慢。

有谁知道更好的方法吗?

1 个答案:

答案 0 :(得分: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"

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