我建立了一个具有14k节点和15k关系的Neo4J数据库。当我运行此查询时:
MATCH (n:RealNode {gid:'12'})<-[:contains*..4]->(z) RETURN DISTINCT ID(z), z.id,n.id as InternalID
Run Code Online (Sandbox Code Playgroud)
得到回复需要5秒钟以上的时间。如果我将4更改为10,则需要花费更多。
我附上了特定节点的节点和关系的屏幕截图:

我的n:RealNode是粉红色的节点,具有CONTAINS关系的节点是灰色的节点。
我的问题如下:1)如何优化查询速度(除索引外)。2)如果我所有的灰色节点都直接位于粉红色节点下,速度会有所不同吗?
我=~在Neo4j docs中找不到这个operator(),但他们在这个例子中使用它:
MATCH (user)-[:friend]->(follower)
WHERE user.name IN ['Joe', 'John', 'Sara', 'Maria', 'Steve'] AND follower.name =~ 'S.*'
RETURN user, follower.name
Run Code Online (Sandbox Code Playgroud)
知道这意味着什么吗?
我有一篇文章和作者的图表.我想找到发表最多的作者.然后我想找到每篇文章的共同作者名单.目的是找出哪些共同作者最频繁地与最富有成效的作者合作.
我是cypher的新手,我在下面有一个非常可怕的命令,效率非常低.有没有更好的方法来进行搜索?
我也想让他们玩结果,所以最好将共同作者列表作为集合返回吗?
MATCH (author:Author)-[:WROTE]->(article:Article) WITH author, COUNT(article) as numberofarticles
ORDER BY numberofarticles DESC LIMIT 1
MATCH (:Author {id:author.id})-[:WROTE]->(article:Article)
MATCH (coauthor:Author)-[:WROTE]->(:Article {id:article.id}) WHERE NOT coauthor:id = author.id
RETURN COUNT(coauthor), article
Run Code Online (Sandbox Code Playgroud) 在过去的几个月里,我一直在建立一个Neo4j数据库.我发现Neo4j和Cypher非常易于使用,绝对适合我正在使用的数据类型.
我希望有人可以提供一些关于如何开始使用REST API的指示.我没有任何Java编码经验,我发现Neo4j文档有点难以理解.根据我的理解,应该可以通过简单的http URL(如http:// localhost:7474/db/data/relationship/types)发送REST请求,这将检索JSON中的一些数据.
我的最终目标是使用某种形式的非常高级的仪表板来总结我的数据库的当前状态,以显示来自几个高级Cypher查询的数据,如下所示:
match (n) return distinct(n.team), count(n)
Run Code Online (Sandbox Code Playgroud)
您可以提供的任何建议将不胜感激.
我正在尝试建模树结构的版本控制系统.这是一个例子:
树的第1版:
的(a)< - :(B) - [belongs_to的]
的(a)< - :(C) - [belongs_to的]
(d)< - [:belongs_to的] - (E)
树的第2版:
的(a)< - :(C) - [belongs_to的]
(d)< - [:belongs_to的] - (b)中
(d)< - [:belongs_to的] - (E)
因此,在版本2中,我将B移动到D.实际上我现在可以通过创建版本节点并将其与所有包含的节点相关联来实现此目的,并在每个BELONGS_TO关系上给出时间属性.所以图表看起来像这样:
版本1
MERGE (a:COMPONENT {name:'a'})
MERGE (b:COMPONENT {name:'b'})
MERGE (c:COMPONENT {name:'c'})
MERGE (d:COMPONENT {name:'d'})
MERGE (e:COMPONENT {name:'e'})
MERGE (version:VERSION {createdOn:'16-4-2015 12:17:00'})
MERGE (version)-[:CONTAINS]->(a)
MERGE (version)-[:CONTAINS]->(b)
MERGE (version)-[:CONTAINS]->(c)
MERGE (version)-[:CONTAINS]->(d)
MERGE (version)-[:CONTAINS]->(e)
MERGE (a)<-[:BELONGS_TO {createdOn:'16-4-2015 12:17:00'}]-(b)
MERGE (a)<-[:BELONGS_TO {createdOn:'16-4-2015 12:17:00'}]-(c)
MERGE (d)<-[:BELONGS_TO {createdOn:'16-4-2015 12:17:00'}]-(e)
RETURN *
Run Code Online (Sandbox Code Playgroud)
版本2
MERGE …Run Code Online (Sandbox Code Playgroud) 我有这个查询返回非常快,0.5秒并返回所有303个预期的记录.注意:"Woka"在这里的意思是"书".
MATCH (p:Publisher)-[r:PUBLISHED]->(w:Woka)<-[s:AUTHORED]-(a:Author),
(l:Language)-[t:USED]->(w:Woka)-[u:INCLUDED]->(b:Bisac)
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
ORDER BY woka_id;
Run Code Online (Sandbox Code Playgroud)
我想添加更多信息,例如说明.我在语言和描述以及描述和书籍(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;
Run Code Online (Sandbox Code Playgroud)
但是我知道从结果集中遗漏了一些记录,50和303之间的差异确实有描述.我使用OPTIONAL构建另一个查询,但是这个(如下所示)永远不会返回,永远运行.
MATCH (p:Publisher)-[r:PUBLISHED]->(w:Woka)<-[s:AUTHORED]-(a:Author),
(l:Language)-[t:USED]->(w:Woka)-[u:INCLUDED]->(b:Bisac)
OPTIONAL MATCH (d:Description)-[v:HAS_DESCRIPTION]-(w:Woka)-[:AUTHORED]-(a:Author) …Run Code Online (Sandbox Code Playgroud) 我正在使用Java中的Neo4j(编辑:2.1.2),并且在不断写入数据的同时文件夹变得越来越大(超出了我的承受能力)。我已超过40 GB。graph.db
我注意到,如果我在不包含所有文件的graph.db情况messages.log下将目录复制到其他位置nioneo_logial.log.*,则数据库仍然是一致的,我仍然可以读取它。因此,我可以为数据提供丰富的负担得起的磁盘存储(几十/几百MB)。
一种解决方案是定期停止提供graph.db,删除所有*.log*文件,然后重新启动应用程序。这不是可接受的解决方案!:)
因此,有什么方法可以在graph.db不生成所有这些日志文件的情况下进行写入?
注意:我在进行事务处理时正在写入neo4j
final Transaction tx = db.beginTx();
Run Code Online (Sandbox Code Playgroud)
其中db是GraphDatabaseService对象。
谢谢,Costin
我使用py2neo将JSON数据作为chyper语句加载到Neo4j中.我的问题是,有时“ ‘ \在我想要作为属性导入到字符串的字符串中有符号等:
MERGE (p:Node {name:’This sign ‘ gives error’})
如果我改为:
MERGE (p:Node {name:” This sign ‘ gives error”})
它将适用于语句,但是当a “在输入字符串中时它将失败.
有没有办法说在字符串中允许所有(或几乎所有)特殊字符?对不起,如果这是一个愚蠢的问题:)
当我在py2neo中尝试使用import语句时,会出现ConstraintViolation错误,但是当我直接在neo4j的shell中导入时,永远不会出现相同的错误。我在两者中都使用相同的确切语句,在py2neo中,我只是使用graph.cypher.execute(...)。请注意,我已经多次确保每个ID是唯一的-没有重复的值。
py2neo.cypher.error.schema.ConstraintViolation: Node 0 already exists with label Employee and property "ID"=[XXXX]
Run Code Online (Sandbox Code Playgroud)
使用py2neo,即使调用了错误并结束了程序,整个命令仍然会用完,就像在neo4j shell中一样填充图形。
问题:如何捕获该错误,以便其余导入语句可以正常运行?我尝试捕获以下内容但未成功:error.ConstraintViolation,error.schema.ConstraintViolation。
此外:遇到严重错误后,导入将继续。但是,导入在“连续”打印之后继续进行。
try:
graph.cypher.execute(statement)
except ConstraintViolation as e:
# print(traceback.format_exec())
print "ConstraintViolation error"
print "continues"
Run Code Online (Sandbox Code Playgroud) 问题:
创建以下MATCH语句的最高效方法是什么?为什么?
详细问题:
假设我们有一个Place具有可变数量属性的节点,需要按类别从可能数十亿个节点中查找节点.我试图围绕每个查询的性能,并证明这是非常困难的.
可能的查询:
Place使用property查找匹配节点:
MATCH (entity:Place { category: "Food" })
匹配Place节点与节点的isCategory关系Food:
MATCH (entity:Place)-[:isCategory]->(category:Food)
匹配Place节点与节点的Food关系Category:
MATCH (entity)-[category:Food]->(:Category)
匹配Food节点与节点的isCategoryFor关系Place:
MATCH (category:Food)-[:isCategoryFor]->(entity:place)
显然所有的变化都介于两者之间.关系方向也是另一回事.
更复杂:
让我们更复杂一点,并说我们现在需要Place使用多个类别查找所有节点.例如:查找Place具有类别的所有节点Food或者Bar
我们只是在另一个MATCH语句上添加?如果没有,那么最合适的路线是什么?
额外:
是否有工具可以帮助我描述遍历过程并告诉我最佳选择方法?