我正在使用Neo4j查找半径50公里且在特定日期可用的用户。
此问题与this other question类似,但自Neo4J 2.0以来索引已发生变化,因此该解决方案不起作用。
我使用Neo4j 2.2.1,Neo4j-spatial 0.14和py2neo / py2neo-spatial与图形进行交互。
要将用户几何图形添加到图表中,我使用:
def create_geo_node(graph, node, layer_name, name, latitude, longitude):
spatial = Spatial(graph)
layer = spatial.create_layer(layer_name)
node_id = node._id
shape = parse_lat_long(latitude, longitude)
spatial.create_geometry(geometry_name=name, wkt_string=shape.wkt, layer_name="Users", node_id=node_id)
..根据需要创建空间节点。
然后,我想通过执行以下方式查询图表:
START user=node:Users('withinDistance:[4.8,45.8,100]')
MATCH period=(start_date:Date)-[:NEXT_DAY*]->(end_date:Date)
WHERE start_date.date="2014-03-03" AND end_date.date="2014-03-04"
UNWIND nodes(period) as nodes_in_period
OPTIONAL MATCH (nodes_in_period)<-[a:AVAILABLE]-(user:User)
RETURN user.uuid, count(a)/count(nodes(period))
但查询返回:
Index `Users` does not exist
似乎py2neo spatial.create_layer(..)创建了图层而不是索引(但它应该吗?..索引现在是Neo4j 1的“遗产”。*)
使用py2neo spatial find_within_distance有效,但由于它使用REST api,我无法制作考虑其他参数的混合请求
根据我的理解,从Neo4j 2.0开始不推荐使用START,但我无法在Neo4j 2.2中找到正确的内部距离Cypher查询
提前谢谢你,
本杰明
答案 0 :(得分:2)
create_layer
创建了一个&#34;空间&#34;索引与Neo的索引不同。它实际上会创建一个图形,为您建模一些边界框,以便您可以对数据执行空间查询。您不需要直接引用此索引。可以把它想象成一个GIS层。
您可以检查您的图表,并挖掘出编写自己的密码查询所需的Node属性。
但您也可以使用py2neo空间API find_within_distance
http://py2neo.org/2.0/ext/spatial.html#py2neo.ext.spatial.plugin.Spatial.find_within_distance
希望这有帮助。
答案 1 :(得分:0)
我认为这些链接可能很有用: * Neo4j Spatial 'WithinDistance' Cypher query returns empty while REST call returns data * https://github.com/neo4j-contrib/spatial/issues/106
但问题并不是你没有得到任何结果,而是索引上的错误......这就是为什么我感到困惑。
你能用一些REST查询直接测试neo4j空间(创建图层和空间节点)看看会发生什么吗?
否则,关于密码启动条件的问题,你只需将这个条件放入匹配的条件中:
MATCH
user=node:Users('withinDistance:[4.8,45.8,100]'),
period=(start_date:Date {date:'2014-03-03'})-[:NEXT_DAY*]->(end_date:Date {date:'2014-03-04'})
UNWIND nodes(period) as nodes_in_period
OPTIONAL MATCH (nodes_in_period)<-[a:AVAILABLE]-(user:User)
RETURN user.uuid, count(a)/count(nodes(period))