我有一个节点列表,表示用户形成事件的历史记录,具有以下模式:
()-[: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)
但是它很慢。
有谁知道更好的方法吗?
答案 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"
然后,您可以在程序中迭代结果,并在属于同一用户的节点之间添加关系。我没有合适的大数据集,但它可能更快。