Neo4j 唯一/独特和计数(因此这可能不是一个好方法),但以下方法似乎有效 select series, sum(1) as number from ( select $series.name as series from ( select from Nodes where in_NEXT is null ) let $series = (traverse out('NEXT') from $current) ) group by series

Neo4j 唯一/独特和计数(因此这可能不是一个好方法),但以下方法似乎有效 select series, sum(1) as number from ( select $series.name as series from ( select from Nodes where in_NEXT is null ) let $series = (traverse out('NEXT') from $current) ) group by series,neo4j,graph-databases,orientdb,Neo4j,Graph Databases,Orientdb,因此,我们将前面的查询包装在另一个查询中,该查询按序列分组,然后获取每行的计数 另一方面,这似乎是一个“昂贵”的查询。也许您可以以更高效的方式创建数据库?不过,这将是另一个问题/讨论 更新以解决您的问题更新 使用数据库设置,“我的所有查询”都在studio web应用程序中工作。不过,控制台中有一些“怪癖”。第一个查询在控制台中提供了以下内容: orientdb {db=stackpeople}> select $series.name from (select from Person

因此,我们将前面的查询包装在另一个查询中,该查询按序列分组,然后获取每行的计数

另一方面,这似乎是一个“昂贵”的查询。也许您可以以更高效的方式创建数据库?不过,这将是另一个问题/讨论


更新以解决您的问题更新 使用数据库设置,“我的所有查询”都在studio web应用程序中工作。不过,控制台中有一些“怪癖”。第一个查询在控制台中提供了以下内容:

orientdb {db=stackpeople}> select $series.name from (select from Person where in_NEXT is null ) let $series = (traverse out('NEXT') from $current)

----+------+-------
#   |@CLASS|$series
----+------+-------
0   |null  |[2]
1   |null  |[2]
2   |null  |[3]
3   |null  |[1]
4   |null  |[3]
5   |null  |[2]
6   |null  |[1]
7   |null  |[1]
----+------+-------
我不知道为什么您的结果显示每个$series行为[0]。可能您没有查询正确的字段(即您没有使用上面的演示数据库)。我的另一个猜测是,您使用的OrientDB版本中存在一个问题—我使用的是2.1-rc6

Null类是正确的,因为这是一个投影查询,而不是一个记录。通过将查询的开头更改为
select*,$series.name from…
,它可以是一条记录

无论出于何种原因,$series不会在控制台中展开,但它会显示$series包含的记录数($series必须是列表)。我通常不使用控制台,所以我不知道这是预期的结果,还是一个bug(我猜这只是它显示列表的方式)。我找到了一种显示名称的方法,使用以下查询

orientdb {db=stackpeople}> select *, $series.name.asString() as names from (select from Person where in_NEXT is null ) let $series = (traverse out('NEXT') from $current)

----+------+------+-----+----+-----+--------+--------------------
#   |@RID  |@CLASS|name |age |ident|out_NEXT|names
----+------+------+-----+----+-----+--------+--------------------
0   |#11:0 |Person|Bob  |30.5|1    |[size=1]|[Bob, Carol]
1   |#11:1 |Person|Bob  |30.5|2    |[size=1]|[Bob, Carol]
2   |#11:4 |Person|Laura|75.0|5    |[size=1]|[Laura, Mike, Alice]
3   |#11:5 |Person|Laura|60.5|6    |null    |[Laura]
4   |#11:6 |Person|Laura|46.0|7    |[size=1]|[Laura, Mike, Alice]
5   |#11:7 |Person|Mike |16.3|8    |[size=1]|[Mike, Carol]
6   |#11:8 |Person|David|86.0|9    |null    |[David]
7   |#11:10|Person|Nigel|69.0|11   |null    |[Nigel]
----+------+------+-----+----+-----+--------+--------------------
关于最后一个查询(姓名计数),我的查询给出

orientdb {db=stackpeople}> select series, sum(1) as number from (select $series.name as series from (select from Person where in_NEXT is null) let $series = (traverse out('NEXT') from $current)) group by series

----+------+------+------
#   |@CLASS|series|number
----+------+------+------
0   |null  |[2]   |2
1   |null  |[3]   |2
2   |null  |[1]   |1
3   |null  |[2]   |1
4   |null  |[1]   |1
5   |null  |[1]   |1
----+------+------+------
这也是正确的(尽管序列显示为结果计数)。这可以通过以下方式进行调整:

orientdb {db=stackpeople}> select names.asString(), sum(1) as number from (select $series.name as names from (select from Person where in_NEXT is null) let $series = (traverse out('NEXT') from $current)) group by names

----+------+--------------------+------
#   |@CLASS|names               |number
----+------+--------------------+------
0   |null  |[Bob, Carol]        |2
1   |null  |[Laura, Mike, Alice]|2
2   |null  |[Laura]             |1
3   |null  |[Mike, Carol]       |1
4   |null  |[David]             |1
5   |null  |[Nigel]             |1
----+------+--------------------+------

请注意,将列表更改为字符串意味着您需要在接收查询结果的任何程序/代码中拆分此字符串,以便了解每个名称。因此,最好不要将其更改为字符串,这样查询实际上会返回一个列表。

愚蠢的问题:如果您已经解决了问题,为什么不直接使用Neo4j?这不是一个愚蠢的问题,总是值得检查:)由于我不想在这里描述的原因,我不能在这个项目中使用Neo4j,但必须使用OrientDB。显然,在这种特殊情况下,Neo4j对我来说会更方便,但它不可用。@arbie如果我能提供帮助,请告诉我(也许这是一个许可问题,可以缓解,等等)-瑞安·博伊德。电子邮件:。在neotechnology.com上,愚蠢的问题:如果你已经解决了问题,为什么不直接使用Neo4j?这不是一个愚蠢的问题,总是值得检查:)由于我不想在这里描述的原因,我不能在这个项目中使用Neo4j,但必须改为使用OrientDB。显然,在这种特殊情况下,Neo4j对我来说会更方便,但它不可用。@arbie如果我能提供帮助,请告诉我(也许这是一个许可问题,可以缓解,等等)-瑞安·博伊德。电子邮件:。非常感谢您的回复,这让我很难理解如何去做。我同意数据模型看起来有点奇怪-它实际上不是我使用的精确的数据模型,但我尝试给出一个简单的数据模型,其中包含足够的信息来解释我想要执行的查询。不过,我不能完全让它发挥作用。您是否希望$series是节点的集合,$series.name返回该集合中节点名称的列表?耶,在本例中,它将是顶点节点的集合。我已创建了一些示例数据以匹配我的原始问题,并尝试了您建议的查询(我在对原始问题的编辑中描述了结果)。恐怕我在获取我想要的结果时仍然遇到问题。如果你能再看一眼,这将非常有帮助。@arbie,我在studio web app中创建并测试了我的查询,这些查询与你刚才提供的数据库设置一起使用。不过控制台返回结果的方式有点奇怪。我将在我的回答。正如您所建议的,这是一个版本控制问题。我在2.0.13中使用了docker映像。我刚刚更新到2.1.4,现在看到了您得到的结果。打得好-谢谢!这解释了为什么我没有取得任何进展。非常感谢您的回复-这让我对如何进行这项工作有了很长的理解。我同意data模型似乎有点奇怪-它实际上并不是我使用的那个模型,但我试图给出一个简单的数据模型,其中包含足够的信息来解释我想要执行的查询。但是,我无法完全实现这一点。您是否希望$series是一个节点集合,$series.name返回该集合中节点名称的列表Action?Yer,在本例中,它将是vertex节点的集合。我创建了一些样本数据以匹配我的原始问题,并尝试了您建议的查询(我在对原始问题的编辑中描述了结果)。恐怕我在获取我想要的结果时仍然遇到问题。如果你能再看一眼,这将非常有帮助。@arbie,我在studio web app中创建并测试了我的查询,这些查询与你刚才提供的数据库设置一起使用。不过控制台返回结果的方式有点奇怪。我将在我的回答。正如您所建议的,这是一个版本控制问题。我在2.0.13中使用了docker映像。我刚刚更新到2.1.4,现在看到了您得到的结果。很好的呼叫-谢谢!这解释了为什么我没有取得任何进展。
----+------+------+-----+----+-----+--------+-------
#   |@RID  |@CLASS|name |age |ident|out_NEXT|in_NEXT
----+------+------+-----+----+-----+--------+-------
0   |#11:6 |Person|Laura|46.0|7    |[#12:5] |null
1   |#11:12|Person|Mike |16.3|13   |[#12:6] |[#12:5]
2   |#11:9 |Person|Alice|5.0 |10   |null    |[#12:6]
----+------+------+-----+----+-----+--------+-------
select $series.name from (
    select from Nodes where in_NEXT is null
)
let $series = (traverse out('NEXT') from $current)
select series, sum(1) as number from (
  select $series.name as series from (
    select from Nodes where in_NEXT is null
  ) 
  let $series = (traverse out('NEXT') from $current)
)
group by series
orientdb {db=stackpeople}> select $series.name from (select from Person where in_NEXT is null ) let $series = (traverse out('NEXT') from $current)

----+------+-------
#   |@CLASS|$series
----+------+-------
0   |null  |[2]
1   |null  |[2]
2   |null  |[3]
3   |null  |[1]
4   |null  |[3]
5   |null  |[2]
6   |null  |[1]
7   |null  |[1]
----+------+-------
orientdb {db=stackpeople}> select *, $series.name.asString() as names from (select from Person where in_NEXT is null ) let $series = (traverse out('NEXT') from $current)

----+------+------+-----+----+-----+--------+--------------------
#   |@RID  |@CLASS|name |age |ident|out_NEXT|names
----+------+------+-----+----+-----+--------+--------------------
0   |#11:0 |Person|Bob  |30.5|1    |[size=1]|[Bob, Carol]
1   |#11:1 |Person|Bob  |30.5|2    |[size=1]|[Bob, Carol]
2   |#11:4 |Person|Laura|75.0|5    |[size=1]|[Laura, Mike, Alice]
3   |#11:5 |Person|Laura|60.5|6    |null    |[Laura]
4   |#11:6 |Person|Laura|46.0|7    |[size=1]|[Laura, Mike, Alice]
5   |#11:7 |Person|Mike |16.3|8    |[size=1]|[Mike, Carol]
6   |#11:8 |Person|David|86.0|9    |null    |[David]
7   |#11:10|Person|Nigel|69.0|11   |null    |[Nigel]
----+------+------+-----+----+-----+--------+--------------------
orientdb {db=stackpeople}> select series, sum(1) as number from (select $series.name as series from (select from Person where in_NEXT is null) let $series = (traverse out('NEXT') from $current)) group by series

----+------+------+------
#   |@CLASS|series|number
----+------+------+------
0   |null  |[2]   |2
1   |null  |[3]   |2
2   |null  |[1]   |1
3   |null  |[2]   |1
4   |null  |[1]   |1
5   |null  |[1]   |1
----+------+------+------
orientdb {db=stackpeople}> select names.asString(), sum(1) as number from (select $series.name as names from (select from Person where in_NEXT is null) let $series = (traverse out('NEXT') from $current)) group by names

----+------+--------------------+------
#   |@CLASS|names               |number
----+------+--------------------+------
0   |null  |[Bob, Carol]        |2
1   |null  |[Laura, Mike, Alice]|2
2   |null  |[Laura]             |1
3   |null  |[Mike, Carol]       |1
4   |null  |[David]             |1
5   |null  |[Nigel]             |1
----+------+--------------------+------