Graph 基于多顶点的遍历
我在OrientDB中创建了一个图形,其中顶点Graph 基于多顶点的遍历,graph,orientdb,graph-traversal,Graph,Orientdb,Graph Traversal,我在OrientDB中创建了一个图形,其中顶点区域和位置,边已访问。您的平均路径是Area>visited>Place>visited>Place>visited>Place等等。它跟踪用户在上一个位置之后访问的位置已访问包含YYYYmmDD日期戳 我试图根据某一天的任意Place顶点找出所有Area顶点,也就是说,我想知道用户首先访问某个地方后从哪些区域来到某个地方 从路径中的任何一个位置进行遍历都很容易,但我只需要为特定的日期戳遵循路径。我所做的是,我为日期戳创建了索引,以便快速访问当天的边
区域和位置,边已访问
。您的平均路径是Area>visited>Place>visited>Place>visited>Place
等等。它跟踪用户在上一个位置之后访问的位置<代码>已访问
包含YYYYmmDD日期戳
我试图根据某一天的任意Place
顶点找出所有Area
顶点,也就是说,我想知道用户首先访问某个地方后从哪些区域来到某个地方
从路径中的任何一个位置
进行遍历都很容易,但我只需要为特定的日期戳
遵循路径。我所做的是,我为日期戳
创建了索引,以便快速访问当天的边缘,然后在中找到第一个位置的。但是现在我不知道如何创建一个快速查询,根据第一个位置
查找所有区域
顶点,同时确保路径也包含第二个位置
。我可以通过shortestPath()
获得第一个和第二个Place
位置之间的路径,但扩展路径以包括区域
顶点仍然存在相同的问题
我在这个问题上找到了一些理论,但是如果有人能给我指出正确的方向,如何使用OrientDB来做这件事,而不是单纯的图论,我会非常感激的——我在过去的一周里一直在做这件事。最初,这是通过bruteforce完成的,遍历所有内容,然后选择,但随着数据库的增长,这显然是不可持续的。Edit
试试这个JavaScript函数,它有三个参数(place、date、propertyPlace)
让我知道它是否有效我创建了三个顶点“区域”、“位置”和“用户”,以及两个边“已访问”和“已放置”,其中datestamp是“已访问”边上的属性。
这样,您就不必每次都将用户作为属性插入边缘
这不是解决这个问题的方法,而是我想出的一个解决办法。灵感来自
我改变了结构,这样每次访问都会创建区域
,而不是静态的,它还包括yyyymmdd时间戳。现在,我可以使用Area
开始查询,并使用已访问的
边来获取放置
顶点,仅用于特定日期
问题是:
SELECT $path, $depth FROM (
TRAVERSE * FROM (
SELECT outE('visited') FROM (
SELECT EXPAND(rid) FROM INDEX:area.dt WHERE key = 20151205
)
) WHILE (@class = 'visited' AND dt = 20151205) OR @class = 'place')
WHERE @class = 'place' AND NOT (outE() contains (dt=20151205))
这将返回带有顶点和边的正确路径,以便您可以验证它仅适用于某一天。但是请注意,区域
不包含在路径中,我仍然需要弄清楚如何执行此操作,但是如果您愿意,您可以在路径中向后遍历第一个访问的边,并以这种方式获得它。您可以添加架构的屏幕吗?你能更好地解释一下吗?你能更具体地说明你对模式的不理解吗?这都在第一段,老实说,我不知道如何更好地解释它,而不知道什么是不清楚的。这是两个顶点区域和位置,以及连接区域到位置和位置到位置的边。位置包含什么?对用户的引用?时间戳本身?或者时间戳在边缘上?Place是一个静态记录,例如Bob's Hamburger Joint。面积是纽约布朗克斯等地理区域的静态记录。时间戳仅存在于边缘中,并随用户访问位置而创建。用户引用也在边上,但我不想在这里提出来,因为在这种情况下,我们在所有路径上聚合,而不管用户如何根据任意位置生成区域列表。是的,完全一样。然而,问题有点复杂。有时我需要多个位置,我只需要获得路径中这些位置所在的区域。例如,如果我有place1
和place2
作为地点要求,并且时间戳为“2015-12-03”,我应该只得到area1
。地点2和地点1必须连续访问,或者不连续访问
select expand(result) from (select myFunction("[place1,place2]","2015-12-03","name") as result)
SELECT $path, $depth FROM (
TRAVERSE * FROM (
SELECT outE('visited') FROM (
SELECT EXPAND(rid) FROM INDEX:area.dt WHERE key = 20151205
)
) WHILE (@class = 'visited' AND dt = 20151205) OR @class = 'place')
WHERE @class = 'place' AND NOT (outE() contains (dt=20151205))