Cypher计算模式中的多个节点

时间:2018-01-19 12:19:58

标签: neo4j cypher

我的Neo4j实例上的Cypher查询有问题。

我有以下图表结构:

(d:Document)-->(t:Token)-->(l:Lemma)

文档可以与许多令牌具有传出关系,而令牌始终存在 来自Document的一个传入关系。令牌总是只有一个 与引理的传出关系,而引理可以有多个传入的关系 来自Tokens。

所以基数为[Document]-n-1-[Token]-1-m-[Lemma]

我希望,对于给定列表documentIds中的每个文档,计算不同标记的数量 和Lemmata在这种模式中,并将前者与后者分开。这应该考虑每个引理可以连接 在模式中的多个标记和这些Lemmata不应该被计为多个 次。

到目前为止,我的查询如下:

MATCH (d:DOCUMENT)--(t:TOKEN)--(l:LEMMA)
WHERE d.id in {documentIds}
WITH d, count(DISTINCT l)/count(DISTINCT t) AS ttr
RETURN d.id AS id, ttr

我觉得这会计算文档中的Lemmata和Tokens, 而不是分别计算每个文件。 我的结果ttr0.0也是d.id

我不知道是否有办法向我提供我的数据库内容。是 查询中有一些明显的错误?

编辑:
我创建了一个控制台。 http://console.neo4j.org/r/yqtrbx

在这种情况下,有两个文档,其标记共享一个共同的引理。 对于此图表,我希望对于ID为10023的文档,结果为2/3,对于ID为10050的文档,结果为2/2。在完整文档中,令牌计数与引理计数之间的差异通常要高得多。

1 个答案:

答案 0 :(得分:3)

您面临的问题与您正在划分两个整数并获得整数作为结果有关。这样,除法2/3将导致零而不是预期的0.66。要修复此问题,只需将其中一个整数转换为float,即:

match (d:DOCUMENT)-->(t:TOKEN)-->(l:LEMMA)
with d, count(distinct l) as cl, count(distinct t) as ct
return d, cl, ct, cl / toFloat(ct)

结果将是(基于您的数据集):

╒════════════╤════╤════╤══════════════════╕
│"d"         │"cl"│"ct"│"cl / toFloat(ct)"│
╞════════════╪════╪════╪══════════════════╡
│{"id":10050}│2   │2   │1                 │
├────────────┼────┼────┼──────────────────┤
│{"id":10023}│2   │3   │0.6666666666666666│
└────────────┴────┴────┴──────────────────┘