Neo4j:做一个"加入"在节点链上

时间:2014-07-02 21:45:38

标签: neo4j cypher

下面是一个图表,可以让您大致了解我的图表的结构:

http://i.stack.imgur.com/hbn0J.png

它只包含:附加到:PersonType的Person节点。每个:人可以表达零或多个意见。这些意见要么是真实意见(:意见),要么是从别人那里借来的意见(:OpinionProxy)。答:OpinionProxy或者:意见总是只有一个:明确的关系。

我写了一个密码查询来回答以下问题: 向我提供所有" Cool Guys"所表达的所有意见,并为每个意见提供此意见经过的人群

示例数据示例:

+--------------------+---------------------+---------------------+
| person             | opinion             | influence           |
+--------------------+---------------------+---------------------+
| "Dan"              | o4                  | "Dan"               |
+--------------------+---------------------+---------------------+
| "Dan"              | o3                  | "Dan", "Jim", "Jay" |
+--------------------+---------------------+---------------------+
| "Bob"              | ...                 | ...                 |
+--------------------+---------------------+---------------------+

这是一个查询所有" Cool Guys"的所有意见的查询:

MATCH 
    (:PersonType {name: "Cool Guys"})<-[:OF_TYPE]-(p:Person)-[:EXPRESSES]->(o), 
    opath=(o)-[:REFERENCES*0..]->(op:Opinion)
RETURN p.name AS person, op AS opinion, opath

到目前为止一切顺利。现在错综复杂的部分来自于试图返回以下链:人而不是链:OpinionProxy - [* 0 ..] - &gt;:意见。这是我的尝试:

MATCH 
    (:PersonType {name: "Cool Guys"})<-[:OF_TYPE]-(p:Person)-[:EXPRESSES]->(o), 
    opath=(o)-[:REFERENCES*0..]->(op:Opinion)
MATCH (x)<-[:EXPRESSES]-(opAuthor:Person)
WHERE x IN nodes(opath)
RETURN p.name AS person, op AS opinion, collect(opAuthor) AS influence

此查询完全返回我想要的内容,但运行速度非常慢

为了给你一个想法,在我的测试环境中我有大约3000:人(包括70&#34;酷男和#34;),3000:意见和3000:OpinionProxy。回复时间:

  • 查询1:约200ms完成
  • 查询2:在大约3200毫秒内完成

这对于&#34;加入&#34;是一个数量级的增加。 :与:相关的人:意见或:OpinionProxy。对于Neo4j而言,这只是一个指针,我不希望在这两个查询之间看到这样的性能差距。

我的第二个查询有什么问题吗?我该如何优化它?

1 个答案:

答案 0 :(得分:0)

您可以尝试在两个匹配语句之间使用WITH语句。我想现在第一个MATCH会一遍又一遍地运行。

MATCH 
    (:PersonType {name: "Cool Guys"})<-[:OF_TYPE]-(p:Person)-[:EXPRESSES]->(o), 
    opath=(o)-[:REFERENCES*0..]->(op:Opinion)
WITH opath,p,op
MATCH (x)<-[:EXPRESSES]-(opAuthor:Person)
WHERE x IN nodes(opath)
RETURN p.name AS person, op AS opinion, collect(opAuthor) AS influence