【发布时间】:2016-12-28 21:31:18
【问题描述】:
假设我在图中有以下路径:
(:Type1)<-[:RelType1]-(:Type2)<-[:RelType2]-()<-[*]-(centernode)-[*]->()-[:RelType2]->(:Type2)-[:RelType1]->(:Type1)
鉴于左侧的(:Type1) 节点的<id>,我能够MATCH 上面的路径并在右侧得到对应的(:Type1) 节点(注意路径是对称的,它的中心是节点(centernode) )。在我的用例中,我们得到(:Type1) 节点的<id>s,在另一侧获取相应的(:Type1) 节点,然后进一步处理。
但是,我可能会得到(:Type1) 的两个节点的<id>s。在这种情况下,将从相应节点开始触发单独的查询,并将评估到另一侧的 (:Type1) 节点,因此将在两个节点上继续执行进一步的执行。
Q1.如何避免同时处理两个节点。也就是说,如果给定两个位于同一路径两端的(:Type1) 节点中的两个<id>s,我如何确保只有一个查询从其中一个与另一侧的节点匹配的节点开始执行,这样只有其中一个节点被进一步处理,另一个节点被保存在临时缓冲区中以供以后处理(如果第一个节点的处理失败)。
补充事实: 上面我有一个路径,在其末端有两个 (:Type1) 节点。我可能有三个或更多路径从(centernode) 发出并以(:Type1) 节点结束。所以我希望只有一个(:Type1) 节点首先得到处理,下一个(:Type1) 节点只有在之前的处理失败时才会处理。
Q2. 这种情况甚至可以用纯密码实现吗?或者我必须最终使用 Neo4J Traversal API?如果是,那么如何做到这一点,因为我必须确保在两个不同的遍历中访问的节点/关系的唯一性。
Q3.如何在 Traversal API 中添加路径扩展器以匹配 (:Type1)<-[:RelType1]-(:Type2)<-[:RelType2]-() 类型的路径。我应该这样做吗:
at each traversal `next()`
if (node is of Type1)
follow <-[:RelType1]-
if (node is of Type2)
follow <-[:RelType2]-
(上面是伪代码。我是 Traversal API 的新手。我已经浏览了所有文档和示例。所以我猜测在扩展器中我必须放入 if() 过滤器来检查当前节点类型并决定哪种关系类型及其下一步展开的方向。上面的伪代码是为了表明这一点。)
这样的密码可以在 Traversal API 中编写吗?或者有没有更好的办法?
【问题讨论】: