【发布时间】:2016-09-19 19:41:01
【问题描述】:
我有一个通用的图结构,我需要根据它们与图中其他节点的连接来找到图中的非叶节点。我要返回的节点的位置没有定义,可能有多个路径到我要返回的节点。我想运行一个查询以将我在排序列表中显示的一堆项目返回给客户端。我不想在客户端运行多个异步查询和排序。
此列表根据将顶点连接在一起的边进行过滤,或者该节点是否连接到另一个节点。过滤条件在客户端更新,导致重新构造查询并重新查询数据库。图中需要返回的节点的位置并不保证对所有结果都相同,它们可能是叶节点,也可能是路径中的任何位置。我想要返回的顶点可以通过通向它们的边上的属性来识别,或者远离它们。每条边上还有一个用于排序的日期属性和一个用于过滤的类型属性。
图表“myGraph”中的图像,如下所示。
-------
| v:1 |\
------- \
| \ \ -------
| | \| v:4 |\
| \ ------- \
| | / ^ \ -------
| \/ | \| v:7 |
| /| return -------
| / \
| / |
------- \
| v:2 |\ |
------- \ \
| \ -------
| \| v:5 |\
| ------- \
| \ -------
| \| v:8 |\
| ------- \
| ^ \ -------
| | \| v:10|
------- return -------
| v:3 |\
------- \
\ -------
\| v:6 |\
------- \
\ -------
\| v:9 |
-------
^
|
return
上图说明了给定一组过滤条件我想要返回的内容,但是如果我更改过滤条件,返回的结果可能会有所不同。我想要返回的节点很容易根据通向它们或远离它们的边缘上的属性来识别。
我有一个类似于以下内容的查询,但我无法找到一种方法来索引路径中的节点,这些节点的边缘通向或远离满足特定过滤条件的节点。
FOR item in vertexCollection1
FILTER .... // FILTER the vertices
FOR v, e, p IN 1..4 OUTBOUND item._id GRAPH 'myGraph'
// ?? Not sure how to efficiently return from here
// ?? FILTER p.vertices[??].v == 7 OR p.vertices[??].v == 10
// ?? FILTER p.edges[??].type == "type1" OR p.edges[??].type == "type2"... etc based on user selections
// ?? LET date = p.edges[vertexPosition - 1].date
// ?? LET data = p.vertices[??]
// SORT DATE_TIMESTAMP(date) DESC
// RETURN {date: date, data: data}
我目前正在使用 [ ** ] 操作根据其所在的集合获取特定节点,使用类似以下内容:
LET data = p.vertices[ ** FILTER CONTAINS(CURRENT._id, "collectionName") OR ...]
但这很尴尬,并且需要将顶点放置在特定的集合中以方便查询构造。这也没有解决如何索引连接到我要返回的节点的关联边的问题。
如果这个问题在其他地方得到回答,我深表歉意,如果它是指向答案的指针,我们将不胜感激。我不确定使用正确的术语来简明地描述问题并进行相应的搜索。
谢谢!
【问题讨论】: