Skip to content

Commit cb907a9

Browse files
authored
Merge branch 'develop' into feat/tentris-quickstart
2 parents 30dcd0d + 59eace2 commit cb907a9

25 files changed

Lines changed: 2549 additions & 0 deletions
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
name: Build and Push Docker Image for Quickstart
2+
3+
on:
4+
release:
5+
type: [published]
6+
push :
7+
paths:
8+
- 'src/neo4j-quickstart/**'
9+
- 'tools/images/Dockerfile-neo4j'
10+
- '.github/workflows/**'
11+
12+
env:
13+
REGISTRY: ghcr.io
14+
15+
jobs:
16+
build-image:
17+
runs-on: ubuntu-latest
18+
#if: github.ref != 'refs/heads/main'
19+
permissions:
20+
contents: read
21+
packages: write
22+
23+
steps:
24+
# https://github.com/actions/checkout
25+
- name: checkout repository
26+
uses: actions/checkout@v4
27+
28+
- name: lowercase image name
29+
run: |
30+
echo "IMAGE_NAME=${GITHUB_REPOSITORY,,}-neo4j" >> ${GITHUB_ENV}
31+
32+
# https://github.com/docker/setup-qemu-action
33+
- name: Set up QEMU
34+
uses: docker/setup-qemu-action@v3.0.0
35+
36+
# https://github.com/docker/setup-buildx-action
37+
- name: Set up Docker Buildx
38+
id: buildx
39+
uses: docker/setup-buildx-action@v3.0.0
40+
41+
- name: Get current release version
42+
id: release-version
43+
run: |
44+
version=$(grep -E '^version += +' pyproject.toml | sed -E 's/.*= +//' | sed "s/['\"]//g")
45+
echo "version=${version}" >> $GITHUB_OUTPUT
46+
echo "version_build=${version}_"$(git rev-parse --short "$GITHUB_SHA") >> $GITHUB_OUTPUT
47+
48+
# https://github.com/docker/build-push-action
49+
- name: Build Docker image
50+
uses: docker/build-push-action@v5.0.0
51+
with:
52+
context: .
53+
platforms: linux/amd64
54+
file: tools/images/Dockerfile-neo4j
55+
push: false
56+
tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.release-version.outputs.version_build }}
57+
build-args: PLATFORM=cu124
58+
outputs: type=image,annotation-index.org.opencontainers.image.description=Run a Graph Neural Network.
59+
60+
push-image:
61+
runs-on: ubuntu-latest
62+
#if: github.ref == 'refs/heads/main'
63+
permissions:
64+
contents: read
65+
packages: write
66+
67+
steps:
68+
# https://github.com/actions/checkout
69+
- name: checkout repository
70+
uses: actions/checkout@v4
71+
72+
- name: lowercase image name
73+
run: |
74+
echo "IMAGE_NAME=${GITHUB_REPOSITORY,,}-neo4j" >> ${GITHUB_ENV}
75+
76+
# https://github.com/docker/setup-qemu-action
77+
- name: Set up QEMU
78+
uses: docker/setup-qemu-action@v3.0.0
79+
80+
# https://github.com/docker/setup-buildx-action
81+
- name: Set up Docker Buildx
82+
id: buildx
83+
uses: docker/setup-buildx-action@v3.0.0
84+
85+
- name: Get current release version
86+
id: release-version
87+
run: |
88+
version=$(grep -E '^version += +' pyproject.toml | sed -E 's/.*= +//' | sed "s/['\"]//g")
89+
echo "version=${version}" >> $GITHUB_OUTPUT
90+
echo "version_build=${version}_"$(git rev-parse --short "$GITHUB_SHA") >> $GITHUB_OUTPUT
91+
92+
# https://github.com/docker/login-action
93+
- name: Log in to the Container registry
94+
uses: docker/login-action@v3.0.0
95+
with:
96+
registry: ${{ env.REGISTRY }}
97+
username: ${{ github.actor }}
98+
password: ${{ secrets.GITHUB_TOKEN }}
99+
100+
# https://github.com/docker/metadata-action
101+
- name: Extract metadata (tags, labels) for Docker
102+
id: meta
103+
uses: docker/metadata-action@v5.0.0
104+
with:
105+
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
106+
tags: |
107+
type=raw,value=latest,enable=${{ github.event_name == 'push' }}
108+
type=raw,value=${{ needs.build-image.outputs.version }},enable=${{ github.event_name == 'release' }}
109+
110+
# https://github.com/docker/build-push-action
111+
- name: Push Docker image
112+
uses: docker/build-push-action@v5.0.0
113+
with:
114+
context: .
115+
platforms: linux/amd64
116+
file: tools/images/Dockerfile-neo4j
117+
push: true
118+
tags: ${{ steps.meta.outputs.tags }}
119+
labels: ${{ steps.meta.outputs.labels }}
120+
build-args: PLATFORM=cu124
121+
outputs: type=image,annotation-index.org.opencontainers.image.description=Run a Graph Neural Network.

.gitignore

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,29 @@
1+
# Tentris environment
12
src/tentris-quickstart/.venv/
3+
4+
# Local environment
25
.venv/
6+
7+
# local test file
8+
src/neo4j-quickstart/local_test.py
9+
10+
# Mac related files
11+
*.DS_Store
12+
13+
# Any env files anywhere in sub repositories
14+
*.env
15+
*quickstart.egg-info
16+
17+
# Python related files
18+
__pycache__/
19+
*.py[cod]
20+
*$py.class
21+
*__pycache__
22+
23+
# Plots
24+
src/neo4j-quickstart/plots/graphs/*
25+
!src/neo4j-quickstart/plots/graphs/.gitkeep
26+
# Cluster plots
27+
src/neo4j-quickstart/plots/clusters/*
28+
!src/neo4j-quickstart/plots/clusters/.gitkeep
29+

README.md

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,86 @@
11
# open-pulse-quickstart
2+
23
Quickstart for Open Pulse. Tutorials and how-tos
4+
5+
## What's Open Pulse?
6+
7+
Open Pulse is an Open Research Data (ORD) toolset developed by **EPFL Open Science** and the **SDSC**. It automates the discovery and monitoring of open-source software (OSS) produced at EPFL, laying the groundwork for making these contributions visible, measurable, and valued within research institutions.
8+
9+
Unlike traditional metrics, which emphasize volume (e.g., downloads or citations), **Open Pulse** puts **community vitality and engagement** at the center — tracking, for example, how actively software is updated, how often issues are resolved, and how software contributions evolve over time. Furthermore, Open Pulse segments repositories by type and discipline, allowing exploration of metrics related to specific research communities.
10+
11+
The platform brings all the data together into **three complementary components** to help make such community contributions visible and actionable:
12+
13+
| **Component** | **What it’s for?** | **Think of it as…** | **Powered by…** |
14+
|----------------|--------------------|----------------------|------------------|
15+
| **Development metrics** | To keep an eye on how active and healthy a software or research community is. | A live dashboard showing who's contributing, how often, and what they're doing — kind of like tracking the *pulse* of a community. | **GrimoireLab**, a set of open-source tools from the Linux Foundation. |
16+
| **Community network** | To explore relationships between things like code repositories, contributors, and organizations. | A tool to answer questions like “Which people are working across multiple projects?” or “How are different organizations connected?” | **Neo4j**, a graph database, and **Cypher**, a language for querying graphs (like SQL but for networks). |
17+
| **Repositories metadata** | To store and query semantic metadata about repositories — like what field of science they belong to, what license they use, or how FAIR (Findable, Accessible, Interoperable, Reusable) they are. | A smart filing cabinet that lets you ask complex questions like “Show me all repositories in biology that use an MIT License and have a Docker image.” | **Tentris**, a database for linked data, and **SPARQL**, a query language for this type of data. |
18+
19+
By combining these layers, **Open Pulse** provides a foundation for **evidence-based evaluation of open-source contributions**, with an emphasis on **community health, engagement, and relevance** across EPFL’s research landscape.
20+
21+
In this Quickstart we will show you how to start accessing this data
22+
23+
## How to use this Quickstart?
24+
25+
TBD: You can run this quickstart in Renku or in local by using the dockerimage we provide
26+
27+
### Development metrics
28+
29+
To be extended...
30+
31+
![alt text](docs/images/GrimoireLabAnalysis.png)
32+
33+
[Link to example](https://dashboard.documentfoundation.org/app/kibana#/dashboard/Overview?_g=()&_a=(description:'Overview%20Panel%20by%20Bitergia',filters:!(('$state':(store:appState),meta:(alias:'Empty%20Commits',disabled:!f,index:git,key:files,negate:!t,params:(query:'0',type:phrase),type:phrase,value:'0'),query:(match:(files:(query:'0',type:phrase)))),('$state':(store:appState),meta:(alias:Bots,disabled:!f,index:git,key:author_bot,negate:!t,params:(query:!t,type:phrase),type:phrase,value:true),query:(match:(author_bot:(query:!t,type:phrase))))),fullScreenMode:!f,options:(darkTheme:!f,useMargins:!t),panels:!((gridData:(h:2,i:'1',w:4,x:0,y:5),id:git_main_numbers,panelIndex:'1',title:Git,type:visualization,version:'6.1.0-3'),(gridData:(h:2,i:'2',w:4,x:4,y:5),id:git_evolution_commits,panelIndex:'2',title:'Git%20Commits',type:visualization,version:'6.1.0-3'),(gridData:(h:2,i:'3',w:4,x:8,y:5),id:git_evolution_authors,panelIndex:'3',title:'Git%20Authors',type:visualization,version:'6.1.0-3'),(gridData:(h:5,i:'5',w:4,x:4,y:0),id:git_commits_organizations,panelIndex:'5',title:Organizations,type:visualization,version:'6.1.0-3'),(gridData:(h:2,i:'6',w:4,x:0,y:7),id:gerrit_main_numbers,panelIndex:'6',title:Gerrit,type:visualization,version:'6.1.0-3'),(gridData:(h:2,i:'7',w:4,x:4,y:7),id:gerrit_evolution_changesets,panelIndex:'7',title:'Gerrit%20Changesets',type:visualization,version:'6.1.0-3'),(gridData:(h:2,i:'8',w:4,x:8,y:7),id:gerrit_evolution_submitters,panelIndex:'8',title:'Gerrit%20Changeset%20Submitters',type:visualization,version:'6.1.0-3'),(gridData:(h:2,i:'96',w:4,x:4,y:11),id:mediawiki_editions,panelIndex:'96',title:'Mediawiki%20Edits',type:visualization,version:'6.1.0-3'),(gridData:(h:2,i:'97',w:4,x:8,y:11),id:mediawiki_editors,panelIndex:'97',title:'Mediawiki%20Editors',type:visualization,version:'6.1.0-3'),(gridData:(h:2,i:'98',w:4,x:0,y:11),id:mediawiki_main_numbers,panelIndex:'98',title:Mediawiki,type:visualization,version:'6.1.0-3'),(gridData:(h:5,i:'111',w:4,x:0,y:0),id:git_overview_top_authors,panelIndex:'111',title:'Git%20Top%20Authors',type:visualization,version:'6.1.0-3'),(gridData:(h:5,i:'112',w:4,x:8,y:0),id:git_overview_top_projects,panelIndex:'112',title:'Git%20Top%20Projects',type:visualization,version:'6.1.0-3'),(gridData:(h:2,i:'113',w:4,x:0,y:9),id:issues_main_metrics,panelIndex:'113',title:'Bugzilla%20Issues',type:visualization,version:'6.1.4'),(gridData:(h:2,i:'114',w:4,x:4,y:9),id:issues_evolutionary,panelIndex:'114',title:'Bugzilla%20Issues',type:visualization,version:'6.1.4'),(gridData:(h:2,i:'115',w:4,x:8,y:9),id:issues_evolutionary_submitters,panelIndex:'115',title:'Bugzilla%20Issue%20Submitters',type:visualization,version:'6.1.4'),(gridData:(h:2,i:'116',w:4,x:0,y:15),id:bd562660-099c-11eb-b2a9-cfa8a0efe987,panelIndex:'116',title:Weblate,type:visualization,version:'6.1.4'),(gridData:(h:2,i:'119',w:4,x:4,y:15),id:'1fe9b9b0-4b9a-11eb-ba3f-e561effddee9',panelIndex:'119',title:'Weblate%20actions',type:visualization,version:'6.1.4'),(gridData:(h:2,i:'120',w:4,x:8,y:15),id:cc367d00-4b97-11eb-ba3f-e561effddee9,panelIndex:'120',title:'Weblate%20contributors',type:visualization,version:'6.1.4'),(gridData:(h:2,i:'121',w:4,x:0,y:13),id:discourse_main_metrics,panelIndex:'121',title:Discourse,type:visualization,version:'6.1.4'),(gridData:(h:2,i:'123',w:4,x:8,y:13),id:discourse_qa_evolutionary_submitters,panelIndex:'123',title:'People%20sending%20Q%26A',type:visualization,version:'6.1.4'),(gridData:(h:2,i:'124',w:4,x:4,y:13),id:discourse_qa_evolutionary,panelIndex:'124',title:'Questions%20and%20Answers',type:visualization,version:'6.1.4')),query:(language:lucene,query:(query_string:(analyze_wildcard:!t,default_field:'*',query:'*'))),timeRestore:!f,title:Overview,uiState:(P-1:(title:Git),P-10:(title:Emails,vis:(legendOpen:!f)),P-100:(title:Meetings),P-101:(title:Representatives%2FCountries),P-102:(title:'-'),P-104:(title:Telegram),P-105:(title:Messages,vis:(legendOpen:!f)),P-106:(title:Participants,vis:(legendOpen:!f)),P-107:(title:'Git%20Pair%20Programming'),P-108:(title:'-'),P-109:(title:Commits,vis:(legendOpen:!f)),P-11:(title:Participants,vis:(legendOpen:!f)),P-110:(title:Authors,vis:(legendOpen:!f)),P-111:(title:'Git%20Top%20Authors',vis:(params:(config:(searchKeyword:''),sort:(columnIndex:!n,direction:!n)))),P-112:(title:'Git%20Top%20Projects',vis:(params:(config:(searchKeyword:''),sort:(columnIndex:!n,direction:!n)))),P-113:(title:'-'),P-114:(title:'-',vis:(legendOpen:!f)),P-115:(title:'Reps%20Activities',vis:(legendOpen:!f)),P-116:(title:'Reps%20Events'),P-117:(title:Reports,vis:(legendOpen:!f)),P-118:(title:Events,vis:(legendOpen:!f)),P-119:(title:Representatives%2FCountries,vis:(legendOpen:!f)),P-12:(title:Issues),P-120:(title:Authors,vis:(legendOpen:!f)),P-121:(title:'-'),P-122:(title:Stars,vis:(legendOpen:!f)),P-123:(title:Pulls,vis:(legendOpen:!f)),P-124:(title:DockerHub),P-13:(title:Issues),P-132:(vis:(params:(config:(searchKeyword:''),sort:(columnIndex:!n,direction:!n)))),P-14:(title:'Issue%20Submitters',vis:(legendOpen:!f)),P-15:(title:Twitter),P-16:(title:Tweets,vis:(legendOpen:!f)),P-17:(title:Users,vis:(legendOpen:!f)),P-18:(title:Stackoverflow),P-19:(title:'Questions%20and%20Answers'),P-2:(title:Commits,vis:(legendOpen:!f)),P-20:(title:Participants),P-22:(title:IRC),P-23:(title:Messages,vis:(legendOpen:!f)),P-24:(title:Participants,vis:(legendOpen:!f)),P-28:(title:Confluence),P-29:(title:Participants,vis:(legendOpen:!f)),P-3:(title:Authors,vis:(legendOpen:!f)),P-30:(title:Editions),P-31:(title:'Github%20Issues'),P-32:(title:'GitHub%20Issues'),P-33:(title:'GitHub%20Issues%20Submitters'),P-34:(title:'GitHub%20Pull%20Requests'),P-35:(title:'Pull%20Requests'),P-36:(title:'Pull%20Request%20Submitters',vis:(legendOpen:!f)),P-37:(title:Jira),P-38:(title:Issues),P-39:(title:Submitters,vis:(legendOpen:!f)),P-40:(title:Issues,vis:(legendOpen:!f)),P-41:(title:Maniphest),P-42:(title:Submitters,vis:(legendOpen:!f)),P-43:(title:Redmine),P-44:(title:Issues),P-45:(title:Submitters,vis:(legendOpen:!f)),P-46:(title:RSS),P-47:(title:Posts),P-48:(title:Authors),P-49:(title:Meetup),P-5:(title:Organizations),P-50:(title:Events),P-51:(title:Participants,vis:(legendOpen:!f)),P-52:(title:Askbot),P-53:(title:'Questions,%20Answers%20and%20Comments',vis:(legendOpen:!f)),P-54:(title:Participants,vis:(legendOpen:!f)),P-55:(title:Discourse),P-56:(title:'Questions%20and%20Answers'),P-57:(title:Participants),P-58:(title:Jenkins),P-59:(title:'Jenkins%20Builds',vis:(legendOpen:!f)),P-6:(title:Gerrit),P-60:(title:'Jenkins%20Active%20Nodes',vis:(legendOpen:!f)),P-62:(title:Hits),P-65:(title:Slack),P-66:(title:'Slack%20Messages'),P-67:(title:'Slack%20Participants'),P-68:(title:'-'),P-69:(title:'-'),P-7:(title:Changesets,vis:(legendOpen:!f)),P-70:(title:'-'),P-71:(title:'-'),P-72:(title:'-'),P-73:(title:'-'),P-74:(title:'-'),P-75:(title:'-'),P-76:(title:'-'),P-77:(title:'-'),P-78:(title:'-'),P-79:(title:'-'),P-8:(title:'Changeset%20Submitters',vis:(legendOpen:!f)),P-80:(title:'-'),P-81:(title:'-'),P-82:(title:'-'),P-83:(title:'-'),P-84:(title:'-'),P-85:(title:'-'),P-86:(title:'-'),P-87:(title:'-'),P-88:(title:'Google%20Hits'),P-89:(title:Hits),P-9:(title:'Mailing%20Lists'),P-90:(title:'Hits%20by%20Keyword'),P-91:(title:'-'),P-92:(spy:(mode:(fill:!f,name:!n)),title:'Apache%20Logs'),P-93:(spy:(mode:(fill:!f,name:!n)),title:'Apache%20Visits'),P-94:(title:'Apache%20Packages'),P-95:(title:'-'),P-96:(title:Editions,vis:(legendOpen:!f)),P-97:(title:Editors,vis:(legendOpen:!f)),P-98:(title:Mediawiki),P-99:(title:'Mozilla%20Club')),viewMode:view))
34+
35+
Link to Grimoire Open Pulse Instance: Waiting for final deployment
36+
Documentation: https://chaoss.community/
37+
CHAOSS Metrics: https://chaoss.community/kbtopic/metrics-and-metrics-models-by-topic/
38+
39+
### Community Network
40+
41+
To be extended....
42+
43+
![alt text](docs/images/Neo4J.png)
44+
45+
Link to Neo4j Open Pulse Instance:
46+
Documentation: https://neo4j.com/docs/
47+
Cypher Tutorial:
48+
49+
#### CSV Example dataset
50+
51+
As an alternative to the interaction with NEO4j we compiled a subset of the graph in csv format which can be found in `data/community-network`.
52+
53+
### Repositories Metadata
54+
55+
To be extended....
56+
57+
Mention Federated queries with Wikipedia
58+
59+
![alt text](docs/images/Tentris.png)
60+
61+
Link to Tentris Open Pulse: http://128.178.219.51:7502/ui
62+
Documentation: https://docs.tentris.io/
63+
SPARQL Tutorial: https://sparql.dev/
64+
65+
#### Document based Metadata
66+
67+
As an alternative to SPARQL we compiled the metadata in a much more familiar formar and included a subset in `data/entities-metadata`
68+
69+
70+
## How to participate in the Mini-Hackathon using Renku?
71+
72+
TBD: Describe here the user flow including Renku use.
73+
74+
![alt text](docs/images/Renku.png)
75+
76+
Link to Renku Project: https://renkulab.io/p/robin.franken-1/quickstart
77+
Jupyter Hub Documentation: https://jupyterhub.readthedocs.io/en/stable/
78+
79+
## How to submit your project?
80+
81+
TBD..
82+
83+
84+
## Credits
85+
86+
TBD.

data/community-network/.keep

Whitespace-only changes.

data/entities-metadata/.keep

Whitespace-only changes.
225 KB
Loading

docs/images/Neo4J.png

540 KB
Loading

docs/images/Renku.png

601 KB
Loading

docs/images/Tentris.png

276 KB
Loading

environment.yml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
name: open-pulse-quickstart
2+
channels:
3+
- conda-forge
4+
- nodefaults
5+
6+
dependencies:
7+
- python=3.12
8+
- numba
9+
- scikit-learn
10+
- pandas
11+
- seaborn
12+
- matplotlib
13+
- jupyterlab
14+
- ipykernel>=7.0.1
15+
- xarray
16+
- pytz
17+
- pyparsing
18+
- pip
19+
- pip:
20+
# For neo4j environment
21+
- deepsmiles
22+
- rdkit
23+
- adjusttext>=1.3.0
24+
- python-dotenv>=0.9.9
25+
- matplotlib>=3.10.7
26+
- neo4j>=6.0.2
27+
- networkx>=3.4.2
28+
- numpy>=2.2.6
29+
- pandas>=2.3.3
30+
- pydantic>=2.12.1
31+
32+
# For Tentris notebook environment
33+
- tentris
34+
- rdflib
35+
36+
prefix: /opt/conda

0 commit comments

Comments
 (0)