避免循环在Neo4j中列出给定长度的路径

时间:2016-11-07 17:38:02

标签: graph neo4j cypher graph-databases nosql

我有以下图表

enter image description here

我尝试在Neo4j中对上图进行建模,以便对于任何重复节点(比如说A),属性“计数”#39;在节点上递增以反映出现的次数A.类似地,对于任何重复的关系(例如A-> B),属性频率为'已更新。

图表的Neo4j控制台已实施here

我以上述方式对图形建模,记住我可以跟踪每个节点和每个单独过渡的出现次数。

我的要求的下一部分是跟踪所有3节点路径,这是我发出的查询,其输出在Neo4j控制台中可见 -

MATCH (n)-[]->(m)-[]->(p) return n.name+' - '+m.name+' - '+p.name as NewName

但是,我想要的输出是 -

A - B - C
B - D - A
D - A - B
B - D - E
E - B - C
D - E - B
A - B - D

但由于节点和关系是唯一的,因此还会报告一个额外的组合。

E - B - D

问题

  1. 我需要在图表设置/查询中更改哪些内容,以便仅报告列出的7种组合而不是8种组合?

  2. 有没有办法计算这种3节点路径的频率?

  3. 我可以创建多个CYPHER脚本来实现这一目标。话虽这么说,CYPHER脚本是作为更大工作流程的一部分自动生成的,我想避免手动输入n节点路径及其频率。

1 个答案:

答案 0 :(得分:3)

您应该更改数据模型。您无需计算和更新countfrequency属性;相反,它们可以直接从适当的数据模型中获得。

例如,让我们使用备用数据模型来创建样本数据。每个命名节点都表示为Foo节点。 Foo节点的每次使用都由Bar节点表示,该节点通过Foo关系引用其FOR节点。 Bar个节点通过NEXT关系链接在一起。

创建样本数据

CREATE (a:Foo {name: 'A'}), (b:Foo {name: 'B'}), (c:Foo {name: 'C'}), (d:Foo {name: 'D'}), (e:Foo {name: 'E'})
CREATE (a1:Bar)-[:FOR]->(a), (b1:Bar)-[:FOR]->(b),
  (a1)-[:NEXT]->(b1)
CREATE (c1:Bar)-[:FOR]->(c),
  (b1)-[:NEXT]->(c1)
CREATE (d1:Bar)-[:FOR]->(d),
  (b1)-[:NEXT]->(d1)
CREATE (a2:Bar)-[:FOR]->(a),
  (d1)-[:NEXT]->(a2)
CREATE (b2:Bar)-[:FOR]->(b),
  (a2)-[:NEXT]->(b2)
CREATE (e1:Bar)-[:FOR]->(e),
  (d1)-[:NEXT]->(e1)
CREATE (b3:Bar)-[:FOR]->(b),
  (e1)-[:NEXT]->(b3)
CREATE (c2:Bar)-[:FOR]->(c),
  (b3)-[:NEXT]->(c2);

获取每个Foo节点的使用次数:

MATCH (f:Foo)<--() RETURN f, COUNT(*) AS count;

获取每对Foo节点按顺序使用的次数:

MATCH (f1:Foo)<-[:FOR]-()-[:NEXT]->()-[:FOR]->(f2:Foo)
RETURN f1, f2, COUNT(*) AS count;

获取按顺序使用每个Foo节点三元组的次数:

MATCH (f1:Foo)<-[:FOR]-()-[:NEXT]->(b1)-[:FOR]->(f2:Foo), (b1)-[:NEXT]->(b2)-[:FOR]->(f3:Foo)
RETURN f1, f2, f3, COUNT(*) as count;

以下是上一个查询的结果,该查询显示了所有7个有效三元组及其出现的次数:

+----------------------------------------------------------------------+
| f1                | f2                | f3                | count    |
+----------------------------------------------------------------------+
| Node[3]{name:"D"} | Node[4]{name:"E"} | Node[1]{name:"B"} | 1        |
| Node[1]{name:"B"} | Node[3]{name:"D"} | Node[4]{name:"E"} | 1        |
| Node[4]{name:"E"} | Node[1]{name:"B"} | Node[2]{name:"C"} | 1        |
| Node[3]{name:"D"} | Node[0]{name:"A"} | Node[1]{name:"B"} | 1        |
| Node[1]{name:"B"} | Node[3]{name:"D"} | Node[0]{name:"A"} | 1        |
| Node[0]{name:"A"} | Node[1]{name:"B"} | Node[3]{name:"D"} | 1        |
| Node[0]{name:"A"} | Node[1]{name:"B"} | Node[2]{name:"C"} | 1        |
+----------------------------------------------------------------------+