【问题标题】:How to make a request on a subgraph?如何对子图提出请求?
【发布时间】:2018-12-06 18:13:49
【问题描述】:

我尝试做一些类似以下的请求:

MATCH path = (f1:Frag)-[r1:I]->(f2:Frag)-[r2:I]->(f3:Frag)-[r3:I]->
 (f4:Frag)-[r4:I]->(f5:Frag)-[r5:I]->(f6:Frag)
 WHERE (r1.at2 <> r2.at1 AND r2.at2 <> r3.at1 AND r3.at2 <> r4.at1
  AND r4.at2 <> r5.at1) AND (not((f1)-[:E]-(f3)) AND not((f1)-[:E]-(f4))
  AND not((f1)-[:E]-(f5)) AND not((f1)-[:E]-(f6)) AND not((f2)-[:E]-(f4))
  AND not((f2)-[:E]-(f5)) AND not((f2)-[:E]-(f6)) AND not((f3)-[:E]-(f5))
  AND not((f3)-[:E]-(f6)) AND not((f4)-[:E]-(f6)))
RETURN path LIMIT 10 

但是当我想将我的请求限制在某些关系上时:

MATCH path = (f1:Frag)-[r1:I]->(f2:Frag)-[r2:I]->(f3:Frag)-[r3:I]->
 (f4:Frag)-[r4:I]->(f5:Frag)-[r5:I]->(f6:Frag)
 WHERE (r1.at2 <> r2.at1 AND r2.at2 <> r3.at1 AND r3.at2 <> r4.at1
  AND r4.at2 <> r5.at1) AND (not((f1)-[:E]-(f3)) AND not((f1)-[:E]-(f4))
  AND not((f1)-[:E]-(f5)) AND not((f1)-[:E]-(f6)) AND not((f2)-[:E]-(f4))
  AND not((f2)-[:E]-(f5)) AND not((f2)-[:E]-(f6)) AND not((f3)-[:E]-(f5))
  AND not((f3)-[:E]-(f6)) AND not((f4)-[:E]-(f6)))
  AND ALL(r in relationships(path) WHERE r.niv <20)
RETURN path LIMIT 10

与所有关系相比,找到一些解决方案需要更多的时间,因为它使用了所有关系。

是否可以将请求限制为子图?

【问题讨论】:

    标签: neo4j cypher subgraph


    【解决方案1】:

    以下大大简化的查询形式在逻辑上应该与您的查询等效(如果来自 Frag 节点的 I 关系始终以 Frag 节点结束),并返回您的有序关系和节点所需的路径。 (实际上您可以只返回rs,因为关系包含对其开始和结束节点的引用)。此查询的profile 也比您的查询简单得多,因此此查询可能更快。

    MATCH p = (:Frag)-[:I*5]->(:Frag)
    WITH RELATIONSHIPS(p) AS rs, NODES(p) AS ns
    WHERE
      ALL(i IN RANGE(0, SIZE(rs)-2) WHERE rs[i].at2 <> rs[i+1].at1) AND
      ALL(j IN ns[0..-2] WHERE ALL(k IN ns[2..] WHERE NOT (j)-[:E]-(k))) AND
      ALL(r in rs WHERE r.niv < 20)
    RETURN *
    LIMIT 10
    

    【讨论】:

    • 这个请求其实比较简单,但是还是很慢。即使 MATCH p = (:Frag)-[:I*5]->(:Frag) WITH RELATIONSHIPS(p) AS rs, NODES(p) AS ns WHERE ALL(r in rs WHERE r.niv
    • 是的,将特定部分移到 MATCH 之后的 WHERE 子句中:MATCH ... WHERE ALL(r in relationships(p) WHERE r.niv &lt; 20) WITH ...
    猜你喜欢
    • 2017-11-04
    • 1970-01-01
    • 2018-08-17
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 2020-01-11
    相关资源
    最近更新 更多