Neo4j-don';我不知道如何改进密码查询

Neo4j-don';我不知道如何改进密码查询,neo4j,cypher,Neo4j,Cypher,我有这个查询返回非常快,0.5秒,并返回所有303条预期记录。注:“沃卡”在这里的意思是“书” MATCH(p:Publisher)-[r:PUBLISHED]->(w:Woka)(w:Woka)-[u:INCLUDED]->(b:Bisac) 其中(a.author_name='Camus,Albert') 返回w.woka_id作为woka_id,p.publisher_name作为publisher_name,w.woka_title作为woka_title,a.author_name作为

我有这个查询返回非常快,0.5秒,并返回所有303条预期记录。注:“沃卡”在这里的意思是“书”

MATCH(p:Publisher)-[r:PUBLISHED]->(w:Woka)(w:Woka)-[u:INCLUDED]->(b:Bisac)
其中(a.author_name='Camus,Albert')
返回w.woka_id作为woka_id,p.publisher_name作为publisher_name,w.woka_title作为woka_title,a.author_name作为author_name,l.language_name作为language_name,b.bisac_code作为bisac_code,b.bisac_value作为bisac_value
由woka_id订购;
我想添加更多信息,例如描述。我创建了描述节点,并创建了语言与描述、描述与书籍(Woka)之间的关系。 下面的查询将所有描述返回为null,但只返回60条记录,而不是303条记录。这是因为不是所有的书都有描述。执行时间仍然正常,0.3秒

MATCH (p:Publisher)-[r:PUBLISHED]->(w:Woka)<-[s:AUTHORED]-(a:Author), 
(l:Language)-[t:USED]->(w:Woka), (b:Bisac)<-[u:INCLUDED]-(w:Woka),
(d:Description)-[v:HAS_DESCRIPTION]-(w) 
WHERE (a.author_name = 'Camus, Albert') 
RETURN w.woka_id as woka_id, p.publisher_name as publisher_name, w.woka_title as woka_title, a.author_name as author_name, l.language_name as language_name, b.bisac_code as bisac_code, b.bisac_value as bisac_value, d.description as description 
ORDER BY woka_id;
MATCH(p:Publisher)-[r:PUBLISHED]->(w:Woka)(w:Woka),(b:Bisac)(w:Woka)(w:Woka)-[u:include]->(b:Bisac)
可选匹配(d:Description)-[v:HAS_Description]-(w:Woka)-[:AUTHORED]-(a:Author)
其中(a.author_name='Camus,Albert')
返回w.woka_id作为woka_id,p.publisher_name作为publisher_name,w.woka_title作为woka_title,a.author_name作为author_name,l.language_name作为language_name,b.bisac_code作为bisac_code,b.bisac_value作为bisac_value,d.description作为description
由woka_id订购;
不知道如何改进查询以获取可选的描述(如果303条记录的原始结果集存在),如果这些描述不存在,则获取空值?

您能试试吗

MATCH (p:Publisher)-[r:PUBLISHED]->(w:Woka)<-[s:AUTHORED]-(a:Author), (l:Language)-[t:USED]->(w)-[u:INCLUDED]->(b:Bisac) 
WHERE (a.author_name = 'Camus, Albert') 
WITH p,r,w,s,a,l,t,u,b
OPTIONAL MATCH (d:Description)-[v:HAS_DESCRIPTION]-(w)
RETURN w.woka_id as woka_id, p.publisher_name as publisher_name, w.woka_title as woka_title, a.author_name as author_name, l.language_name as language_name, b.bisac_code as bisac_code, b.bisac_value as bisac_value, d.description as description 
ORDER BY woka_id;
MATCH(p:Publisher)-[r:PUBLISHED]->(w:Woka)(w)-[u:include]->(b:Bisac)
其中(a.author_name='Camus,Albert')
有p,r,w,s,a,l,t,u,b
可选匹配(d:描述)-[v:具有_描述]-(w)
返回w.woka_id作为woka_id,p.publisher_name作为publisher_name,w.woka_title作为woka_title,a.author_name作为author_name,l.language_name作为language_name,b.bisac_code作为bisac_code,b.bisac_value作为bisac_value,d.description作为description
由woka_id订购;
你能试试这个吗

MATCH (p:Publisher)-[r:PUBLISHED]->(w:Woka)<-[s:AUTHORED]-(a:Author), (l:Language)-[t:USED]->(w)-[u:INCLUDED]->(b:Bisac) 
WHERE (a.author_name = 'Camus, Albert') 
WITH p,r,w,s,a,l,t,u,b
OPTIONAL MATCH (d:Description)-[v:HAS_DESCRIPTION]-(w)
RETURN w.woka_id as woka_id, p.publisher_name as publisher_name, w.woka_title as woka_title, a.author_name as author_name, l.language_name as language_name, b.bisac_code as bisac_code, b.bisac_value as bisac_value, d.description as description 
ORDER BY woka_id;
MATCH(p:Publisher)-[r:PUBLISHED]->(w:Woka)(w)-[u:include]->(b:Bisac)
其中(a.author_name='Camus,Albert')
有p,r,w,s,a,l,t,u,b
可选匹配(d:描述)-[v:具有_描述]-(w)
返回w.woka_id作为woka_id,p.publisher_name作为publisher_name,w.woka_title作为woka_title,a.author_name作为author_name,l.language_name作为language_name,b.bisac_code作为bisac_code,b.bisac_value作为bisac_value,d.description作为description
由woka_id订购;

我想我们早就谈过了

你必须记下你的中间基数

在人际关系中使用方向

不要重复已经解决的模式,比如

应该是

OPTIONAL MATCH (d:Description)-[v:HAS_DESCRIPTION]-(w)
如果要匹配长路径,则需要在路径之间创建大量的潜在匹配,对于这些行中的每一行,将执行下一个匹配,如果它们创建多行,则会得到
rows1*rows2*rows3

因此,您必须使用
DISTINCT
或两者之间的聚合来尽可能降低基数

仅在第一个示例中演示它,一次使用
DISTINCT
,一次使用
collect
。这里可能没有必要,但这只是为了演示,因为示例足够小

MATCH (p:Publisher)-[r:PUBLISHED]->(w:Woka)<-[s:AUTHORED]-(a:Author)
WHERE (a.author_name = 'Camus, Albert') 
WITH DISTINCT w,a,p

MATCH (l:Language)-[t:USED]->(w)
WITH w,a,p, collect(l) as languages

MATCH (w)-[u:INCLUDED]->(b:Bisac) 
RETURN w.woka_id as woka_id, w.woka_title as woka_title, 
       p.publisher_name as publisher_name, 
       a.author_name as author_name, 
       [l in languages | l.language_name] as language_names, 
       b.bisac_code as bisac_code, b.bisac_value as bisac_value 
ORDER BY woka_id;

我想我们早就谈过了

你必须记下你的中间基数

在人际关系中使用方向

不要重复已经解决的模式,比如

应该是

OPTIONAL MATCH (d:Description)-[v:HAS_DESCRIPTION]-(w)
如果要匹配长路径,则需要在路径之间创建大量的潜在匹配,对于这些行中的每一行,将执行下一个匹配,如果它们创建多行,则会得到
rows1*rows2*rows3

因此,您必须使用
DISTINCT
或两者之间的聚合来尽可能降低基数

仅在第一个示例中演示它,一次使用
DISTINCT
,一次使用
collect
。这里可能没有必要,但这只是为了演示,因为示例足够小

MATCH (p:Publisher)-[r:PUBLISHED]->(w:Woka)<-[s:AUTHORED]-(a:Author)
WHERE (a.author_name = 'Camus, Albert') 
WITH DISTINCT w,a,p

MATCH (l:Language)-[t:USED]->(w)
WITH w,a,p, collect(l) as languages

MATCH (w)-[u:INCLUDED]->(b:Bisac) 
RETURN w.woka_id as woka_id, w.woka_title as woka_title, 
       p.publisher_name as publisher_name, 
       a.author_name as author_name, 
       [l in languages | l.language_name] as language_names, 
       b.bisac_code as bisac_code, b.bisac_value as bisac_value 
ORDER BY woka_id;

除了@pablosaraiva的回复之外,请确保您在以下方面有一个索引:Author and property
Author\u name

create index on :Author(author_name)

如果这和巴勃罗的回答没有帮助,请发布你的查询计划。使用
explain
(假设你在>=2.2上)

除了@pablosaraiva的回复之外,确保你有一个关于:作者和财产
作者姓名
的索引:

create index on :Author(author_name)

如果这和巴勃罗的回答没有帮助,请发布你的查询计划。使用
explain
进行解释(假设您使用的是>=2.2)

为什么要使用版本?为什么要使用版本?我会用
之前拉出
位置。编辑的版本工作,在0.5秒内返回303行。上一个再也没有回来。但是,这303行中的一行的说明不应为null,但结果行的说明为null。对于woka_id='97818691945290000000'来说,这种情况正在发生。显示此描述不为空的小查询是:MATCH(d:description)-(HAS_description)-(w:woka)-(Author)-(a:Author),(l:Language)-(USED)-(w)-(Publisher),(b:Bisac)-(include)-(w)where(d.woka_id='97818691945290000000')返回d,w,a,l,p,b;您可以将数据的子集发布到存在这些关系且有此作者描述的位置吗?抱歉,不需要发布某些数据,我发现了错误,查询应返回d.description\u文本,而不是d.description。d、 description不作为属性存在,这是返回空值的原因。我将使用
之前调出
WHERE
。编辑的版本工作正常,在0.5秒内返回303行