可能的Cypher问题 - Neo4J查询耗尽内存和服务器停顿

时间:2018-02-15 19:03:30

标签: memory neo4j cypher heap

我遇到Neo4J的问题,系统内存不足以执行我的查询。我已经将堆的大小增加到3GB,这导致了相同的问题,只是在数据集损坏的同一点耗尽内存需要更长的时间(我已经很长时间了损害过程因此数据库中已有大量数据,但数据并不多.DB为350MB,有176780个节点和259463个关系)。

也就是说,我通过REST接口将我的查询与节点发送到Neo4J,它变得没有响应。很长一段时间没有回复,最终它告诉我内存不足。堆大小的增加唯一的做法是使这个超时更长。在调试日志中,我看到垃圾收集器完全锤击了应用程序线程。对于数据的大部分初始部分,它似乎工作得很好,而且我不太确定这里发生了什么。

我觉得这可能是与我的查询做一些愚蠢相关的问题,因此我在下面添加了代码示例,希望有人发现错误,如果它存在的话。

首先,我想要实现的目标:

  • 查询1只是推送创建节点(如果它们是新的),如果关系是新的则关联(这是通过node.js从CSV读取的数据)
  • 使用查询2,我基本上是这样说:寻找标签的任何节点" HashInput"这与我给你的某个密钥(电子邮件)的价值相匹配,然后找到任何" CustomerHash"它所连接的节点,以及任何其他" CustomerHash"与该节点共享间接关系(通过共享HashInput)。如果其中任何一个" HashNodes"涉及超过1" customerNode"。在这种情况下,必须将这些customerNodes合并到一个节点中并且连接属性。

为了更直观地展示这一点,在下面的图像A和B必须合并。 " CustomerNodes"的总和对于这两个" CustomerHashes" (但可以是n个节点,因此是无界搜索)通过" HashInput"是>因此,他们需要合并。

Schema

然后是实际的查询:

查询1): 我在这里生成一个密码查询,结果是:

`
MERGE (base: ${labels} { ${stringifiedProperties} } )

WITH base
MATCH (connectingNode: ${labelsConnectingNode} { ${ connetingNodeProperties } } )
MERGE ( base )-[r:${relationshipLabell}  { ${ relationshipProperties } } ]->(connectingNode)
`

查询2(这是阻止的那个)):

`
MATCH
(seed:HashInput { customer_email: '${cleanEmail}' })-[:CONSISTS_OF*]-(Hashes:CustomerHash)
    -[:IS_LIKELY_CUSTOMER]->
(CustomerNodes:Customer)

WITH
count( DISTINCT ID( CustomerNodes ) ) AS countCustomerNodes,
collect(CustomerNodes) as CustomerNodesList,
collect(Hashes) as hashList,
collect(DISTINCT Hashes._customer_email) as eMails,
collect(DISTINCT Hashes._card_fingerprint) as cardFingerprints

WHERE countCustomerNodes > 1

MERGE (newCustomerNode:Person:Customer { eMails: 0, cardFingerprints : 0 })
SET newCustomerNode.eMails = eMails
SET newCustomerNode.cardFingerprints = cardFingerprints

WITH
hashList,
CustomerNodesList,
newCustomerNode

UNWIND hashList as Hashes

WITH
Hashes,
CustomerNodesList,
newCustomerNode

UNWIND CustomerNodesList as CustomerNodes

DETACH DELETE CustomerNodes
MERGE (Hashes)-[r:IS_LIKELY_CUSTOMER]->(newCustomerNode)
`

0 个答案:

没有答案