下面是一个图表,可以让您大致了解我的图表的结构:
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。回复时间:
这对于&#34;加入&#34;是一个数量级的增加。 :与:相关的人:意见或:OpinionProxy。对于Neo4j而言,这只是一个指针,我不希望在这两个查询之间看到这样的性能差距。
我的第二个查询有什么问题吗?我该如何优化它?
答案 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