Graph 基于多顶点的遍历

Graph 基于多顶点的遍历,graph,orientdb,graph-traversal,Graph,Orientdb,Graph Traversal,我在OrientDB中创建了一个图形,其中顶点区域和位置,边已访问。您的平均路径是Area>visited>Place>visited>Place>visited>Place等等。它跟踪用户在上一个位置之后访问的位置已访问包含YYYYmmDD日期戳 我试图根据某一天的任意Place顶点找出所有Area顶点,也就是说,我想知道用户首先访问某个地方后从哪些区域来到某个地方 从路径中的任何一个位置进行遍历都很容易,但我只需要为特定的日期戳遵循路径。我所做的是,我为日期戳创建了索引,以便快速访问当天的边

我在OrientDB中创建了一个图形,其中顶点
区域
位置
,边
已访问
。您的平均路径是
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))