总的来说,我对图形数据库和neo4j非常陌生,但我正在尝试使用这种方法来解决问题。
我有两个数据集,一个是addresses
和DOC_ID
,其中许多地址通过is_in
关系与文档相关。每个DOC_ID
中可以有多个地址。
第二数据集具有主owners
和DOC_ID
,其中owners
与每个文档ID具有is_in
关系。
数据集1如下所示。
address DOC_ID
1 123 Rock Rd 0134
2. 456 John Drive 2157
3. 789 York St. 9871
4. 927 Farm Ct. 9871
...
数据集2的情况也类似:
owner DOC_ID
1 John D. 0134
2. Sarah Cote 2157
3. Jack Ma 9871
...
我用来加载这些数据的查询:
# Dataset 1 with addresses
LOAD CSV WITH HEADERS FROM 'file:///addresses.csv' AS row
WITH row WHERE row.address IS NOT NULL
MERGE (l:location {address: row.address, doc_id:row.DOC_ID})
MERGE (d:doc {doc_id:row.DOC_ID})
MERGE (l)-[r:is_in]->(d)
# Dataset 2 with home owners
LOAD CSV WITH HEADERS FROM 'file:///owners.csv' AS row
WITH row WHERE row.owner IS NOT NULL
MERGE (n:home_owner {name: row.owner, doc_id:row.DOC_ID})
MERGE (d:doc {doc_id:row.DOC_ID})
MERGE (n)-[r:is_in]->(d)
地址数据集包含所有者的地址以及其他不相关的地址。同样,相同的所有者可能会出现在不同的名字下,但我知道他们应该有相同的地址。我最终想要做的是发现owner
实体以不同的名称运行。
我可以推断,与所有者的地址相比,地址在数据集中出现的次数相对较少,而所有者的地址应该出现在与该所有者关联的大多数文档中。因此,我在下面写了这个查询,它将有助于找出一些所有者地址。但是我从这个查询中得到了0个结果。
MATCH(n:home_owner-[f:is_in]->(d:doc)<-[r:is_in]-(l:location)
WITH l, n, count(r) as rct
WHERE rct > 20
RETURN l, n
我想知道这是我的问题,还是我的逻辑不正确。或者在 neo4j 中有更好的方法来解决这个问题?任何帮助/见解都将不胜感激。
1条答案
按热度按时间vltsax251#
第二行:使用l,n,count(R)作为RCT是问题所在。当您进行聚合时,它将在分组中包括l和n(类似于SQL group by)。因此,您没有获得正确的RCT计数,因为每个位置和所有者在分组中都被计算为一个。这是对您的问题的正确查询。
其次,您的加载脚本中存在打字错误。我现在改正了。
带地址的数据集1
房主数据集2