远程 neo4j gremlin 不一致的结果
Remote neo4j gremlin inconsistent results
我设置了一个 neo4j 服务器、gremlin 服务器和 gremlin 控制台。我正在使用 SteelBridgeLabs/neo4j-gremlin-bolt 将 gremlin 服务器连接到 neo4j。当我添加多个节点并尝试从 gremlin 控制台获取所有节点时,我得到不一致的结果。它不 return 所有节点。
neo4j.properties
gremlin.graph=com.steelbridgelabs.oss.neo4j.structure.Neo4JGraph
#neo4j.graph.name=graph.db
neo4j.identifier=dummy
neo4j.url=bolt://localhost:7687
neo4j.username=neo4j
neo4j.password=pass
neo4j.readonly=false
neo4j.vertexIdProvider=com.steelbridgelabs.oss.neo4j.structure.providers.Neo4JNativeElementIdProvider
neo4j.edgeIdProvider=com.steelbridgelabs.oss.neo4j.structure.providers.Neo4JNativeElementIdProvider
这就是我添加节点及其结果的方式
gremlin> g.addV('cat').property("name","sylvester")
==>v[null]
gremlin> g.addV('cat').property("name","tom")
==>v[null]
gremlin> g.addV('cat').property("name","garfield")
==>v[null]
gremlin> g.addV('mice').property("name","jerry")
==>v[null]
Neo4j 浏览器可以毫无问题地显示这些节点。但是当我从 gremlin-console 查询时,我得到如下不同的结果
gremlin> g.V().valueMap()
==>{name=[garfield]}
==>{name=[sylvester]}
==>{name=[tom]}
==>{name=[jerry]}
gremlin> g.V().valueMap()
==>{name=[garfield]}
上面的评论显然引出了这里的答案,但我不能说我很清楚为什么提到的修复实际上解决了问题。
对于那些遇到这个问题的人,我将总结一下这种连接的预期工作方式。从 Gremlin 控制台连接到 Gremlin 服务器:
:remote connect tinkerpop.server conf/remote.yaml
打开一个无会话连接,这会创建一个服务器为您管理事务的情况,这意味着每次您向服务器提交请求时,都会打开一个事务,执行遍历并关闭事务。这也意味着在每个请求结束时,应该自动提交(或在失败时回滚)对图的任何更改。使用该模型,应该不会出现过时或不一致数据的情况。
以该概念为基础,执行提交:
gremlin> g.tx().rollback();g.V().valueMap()
在此(和任何)连接模型下,应该自动显式地生成新事务,因此永远不会生成陈旧的结果集。
以下连接方法产生一个会话,以便用户管理事务:
:remote connect tinkerpop.server conf/remote.yaml session
因此可能会产生不一致的状态。您必须根据需要显式提交和回滚事务,因为事务可以扩展到多个请求。换句话说,期望在不同的执行线程中获取对图形所做的最新更改之前调用 g.tx().rollback()
是必要的。
最终的连接选项如下,它融合了两个概念:
:remote connect tinkerpop.server conf/remote.yaml session-managed
从变量在请求之间保留的意义上说,您获得了一个会话,但每个请求代表一个事务,该事务在每个请求结束时提交或回滚。与无会话连接一样,您不应期望出现不一致的状态或陈旧数据,并且如前所述,在查询之前使用 g.tx().rollback()
应该会强制启动一个新事务,即使托管事务因某种原因未能按预期运行也是如此。
如果这些东西没有像这里描述的那样工作,我可能想知道图形提供者本身以及它的事务语义是否完全符合 TinkerPop 模型。
我设置了一个 neo4j 服务器、gremlin 服务器和 gremlin 控制台。我正在使用 SteelBridgeLabs/neo4j-gremlin-bolt 将 gremlin 服务器连接到 neo4j。当我添加多个节点并尝试从 gremlin 控制台获取所有节点时,我得到不一致的结果。它不 return 所有节点。
neo4j.properties
gremlin.graph=com.steelbridgelabs.oss.neo4j.structure.Neo4JGraph
#neo4j.graph.name=graph.db
neo4j.identifier=dummy
neo4j.url=bolt://localhost:7687
neo4j.username=neo4j
neo4j.password=pass
neo4j.readonly=false
neo4j.vertexIdProvider=com.steelbridgelabs.oss.neo4j.structure.providers.Neo4JNativeElementIdProvider
neo4j.edgeIdProvider=com.steelbridgelabs.oss.neo4j.structure.providers.Neo4JNativeElementIdProvider
这就是我添加节点及其结果的方式
gremlin> g.addV('cat').property("name","sylvester")
==>v[null]
gremlin> g.addV('cat').property("name","tom")
==>v[null]
gremlin> g.addV('cat').property("name","garfield")
==>v[null]
gremlin> g.addV('mice').property("name","jerry")
==>v[null]
Neo4j 浏览器可以毫无问题地显示这些节点。但是当我从 gremlin-console 查询时,我得到如下不同的结果
gremlin> g.V().valueMap()
==>{name=[garfield]}
==>{name=[sylvester]}
==>{name=[tom]}
==>{name=[jerry]}
gremlin> g.V().valueMap()
==>{name=[garfield]}
上面的评论显然引出了这里的答案,但我不能说我很清楚为什么提到的修复实际上解决了问题。
对于那些遇到这个问题的人,我将总结一下这种连接的预期工作方式。从 Gremlin 控制台连接到 Gremlin 服务器:
:remote connect tinkerpop.server conf/remote.yaml
打开一个无会话连接,这会创建一个服务器为您管理事务的情况,这意味着每次您向服务器提交请求时,都会打开一个事务,执行遍历并关闭事务。这也意味着在每个请求结束时,应该自动提交(或在失败时回滚)对图的任何更改。使用该模型,应该不会出现过时或不一致数据的情况。
以该概念为基础,执行提交:
gremlin> g.tx().rollback();g.V().valueMap()
在此(和任何)连接模型下,应该自动显式地生成新事务,因此永远不会生成陈旧的结果集。
以下连接方法产生一个会话,以便用户管理事务:
:remote connect tinkerpop.server conf/remote.yaml session
因此可能会产生不一致的状态。您必须根据需要显式提交和回滚事务,因为事务可以扩展到多个请求。换句话说,期望在不同的执行线程中获取对图形所做的最新更改之前调用 g.tx().rollback()
是必要的。
最终的连接选项如下,它融合了两个概念:
:remote connect tinkerpop.server conf/remote.yaml session-managed
从变量在请求之间保留的意义上说,您获得了一个会话,但每个请求代表一个事务,该事务在每个请求结束时提交或回滚。与无会话连接一样,您不应期望出现不一致的状态或陈旧数据,并且如前所述,在查询之前使用 g.tx().rollback()
应该会强制启动一个新事务,即使托管事务因某种原因未能按预期运行也是如此。
如果这些东西没有像这里描述的那样工作,我可能想知道图形提供者本身以及它的事务语义是否完全符合 TinkerPop 模型。